gpt4 book ai didi

java - 无法解析 JSON 属性 "null"

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:21 33 4
gpt4 key购买 nike

我在尝试解析 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解析它。有人可以澄清一下吗?为什么这个库抛出异常,但在线 validator 说它是有效的 JSON?这是库中的错误还是我做错了什么?

最佳答案

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

我建议针对此问题向 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}

关于java - 无法解析 JSON 属性 "null",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6687235/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com