让我们假设以下理论情况:一个webapp描述了北极的奇怪生物,包括一个奇怪的长鼻子生物,如食蚁兽吃北极青蛙,爱斯基摩人称之为"nh-oo-l",或更常见的,"空".
在将关于此生物的数据写入webapp时,我们写下以下行:
net.sf.json.JSONObject creatureJson = new JSONObject();
creatureJson.element("name", "null");
Run Code Online (Sandbox Code Playgroud)
但是,这会在值解析器中遇到问题:
在net.sf.json.AbstractJSON中:
protected Object _processValue( Object value, JsonConfig jsonConfig ) {
if( JSONNull.getInstance().equals( value ) ) {
return JSONNull.getInstance();
...
Run Code Online (Sandbox Code Playgroud)
在net.sf.json.JSONNull中:
public boolean equals( Object object ) {
return object == null || object == this || object == instance
|| (object instanceof JSONObject && ((JSONObject) object).isNullObject())
|| "null".equals( object );
}
Run Code Online (Sandbox Code Playgroud)
因此,结果是,即使我们实际上想要使用"null"作为我们的值(我们也不希望返回值必须处理实际的空值),它将作为JSONNull返回,并得到打印作为{"name": null}.
我一直在尝试搜索net.sf.json的文档和配置选项以解决这个问题,但所有的行为似乎都是硬编码的.我的理解是这是一个非常常见的库.如何以这种方式运作?
注意:要清楚,这是针对创建 JSON而不是解析的情况.有一个类似的问题不能解析JSON属性"null",但问题是用户试图使用单引号进行解析; 根本问题与null完全无关.