net.sf.JSONObject - 如何故意将字符串“null”作为值写入

时间:2018-02-28 21:58:53

标签: java json

让我们假设以下理论情况:一个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完全无关。

0 个答案:

没有答案