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