3

我在尝试解析 JSON“null”属性时遇到了一个麻烦,请帮助我了解真正的问题是什么。我有以下 JSON:

{
  "properties" : {        
    "null" : {
      "value" : false
    }
  }
}

我使用http://jsonlint.com来验证这个 JSON 是否有效。我试图从java中解析它:

import net.sf.json.JSONObject;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        String st = "{" +
                "      'properties' : {" +
                "        'null' : {" +
                "          'value' : false" +
                "        }" +
                "      }" +
                "}";
        JSONObject.fromObject(st);
    }
}

但得到了例外:

Exception in thread "main" java.lang.ClassCastException: JSON keys must be strings.
    at net.sf.json.JSONObject._fromJSONObject(JSONObject.java:927)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:155)
    at net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:108)
    at net.sf.json.AbstractJSON._processValue(AbstractJSON.java:238)
    at net.sf.json.JSONObject._processValue(JSONObject.java:2655)
    at net.sf.json.JSONObject.processValue(JSONObject.java:2721)
    at net.sf.json.JSONObject.element(JSONObject.java:1786)
    at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1036)
    at net.sf.json.JSONObject._fromString(JSONObject.java:1201)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:165)
    at net.sf.json.JSONObject.fromObject(JSONObject.java:134)

我使用来自http://json-lib.sourceforge.net的 json-lib-2.4-jdk15.jar来解析它。有人可以澄清一下吗?为什么这个库抛出异常,但在线验证器说它是有效的 JSON?这是图书馆的错误还是我做错了什么?

4

4 回答 4

3

JSON-lib 最初使用输入 JSON 解析和填充 Java Map。不幸的是,JSON-lib 然后检查每个 JSON 对象元素名称是否是 JSON null。它的null检查是在JSONNull.equals(Object)方法中执行的。此方法为“null”JSON 字符串返回 true,当然这实际上不是 JSONnull值。

我建议为这个问题在 JSON-lib 项目中提交一个错误。的执行JSONNull.equals(Object)是有缺陷的。

不幸的是,无法使用自定义PropertyNameProcessor.

可用于更直接的解决方案的选项包括自己更改 JSON-lib 代码或切换库。

如果您可以切换库,我强烈推荐Jackson。以下是使用它反序列化原始问题中的示例 JSON 的示例。

/*
{
  "properties" : {        
    "null" : {
      "value" : false
    }
  }
}
 */
String json = "{\"properties\":{\"null\":{\"value\":false}}}";

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(json, Map.class);
System.out.println(map);
// output: {properties={null={value=false}}}

Map<String, Object> propertiesMap = (Map) map.get("properties");
System.out.println(propertiesMap);
// output: {null={value=false}}

Map<String, Object> nullMap = (Map) propertiesMap.get("null");
System.out.println(nullMap);
// output: {value=false}
于 2011-07-15T01:35:03.890 回答
2

发布的第一个 JSON 是有效的 JSON:然而,Java 中的 JSON 无效——仅对"[required] 键引用有效。来自json.org

字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义...。

但是,这听起来像一个错误,假设它不是由提供给它的无效JSON触发的(库可以使用无效 JSON 做任何事情)......必须查看源代码(或错误报告/用户体验) 如果这确实是一个“错误”,则可以得出结论。我在下面添加了一些可以尝试的建议,这些建议可能会显示预期的行为,也可能会更详细地概述原因/问题。

考虑这个最小的测试用例(使用有效的 JSON):

String st = "{ \"null\": \"hello world!\" }";

这也可能会揭示更多信息,具体取决于第一项是否"null"null何时提取:

String st = "[ \"null\" ]";

快乐编码。

于 2011-07-14T00:35:23.920 回答
0

gson 库链接是:

http://code.google.com/p/google-gson/

我通常使用 usr gson 来生成 josn 字符串,所以我找到了其他人在 stackoverflow 中发布的一些示例,以使用 gson 解析 json 字符串,请参阅链接:

将 JSON 转换为 Java

于 2012-03-02T02:02:05.007 回答
-1

建议你使用Gson,

并使用java Map和List构造json字符串,然后使用Gson输出Map或List对象

于 2011-07-14T01:38:20.210 回答