将字符串转换为JSON不起作用 Java

3

我需要将字符串转换为json,但是遇到了问题。 我的json字符串如下:

{"serverId":2,"deviceId":736,"analysisDate":"2017-05-11T07:20:27.713Z","eventType":"Logs","eventAttributes":[{"name":"level","value":"INFO"},{"name":"type","value":"Video Blocked On"},{"name":"cameraId","value":"722"},{"name":"userId","value":"1"}]}

我的代码:

    try {
        JSONObject object = new JSONObject(jsonString);
        JSONArray array = object.getJSONArray("eventAttributes");
        System.out.println("ARRAY: " + array);

        for (int i = 0; i < array.length(); i++) {
            JSONObject obj = new JSONObject(array.getJSONObject(i));
            System.out.println("OBJ: " + obj);

        }
    } catch (JSONException ex) {
        Exceptions.printStackTrace(ex);
    }

数组的System.out.println是:

[{"name":"level","value":"INFO"},{"name":"type","value":"Video Blocked On"},{"name":"cameraId","value":"722"},{"name":"userId","value":"1"}]

但是如果我打印obj的结果是"{}",这样四次。所以它是正确的,因为数组有4个元素,但是为什么它是空对象?我正在使用org.json库。
谢谢

尝试使用 obj.toString(); API。 - Shubham Naik
1
@ShubhamNaik 你为什么认为那会起作用呢? - Scary Wombat
它应该打印对象描述,也许我们可以得到一些关于正在发生的事情的细节。 - Shubham Naik
1
OP,你为什么要写 new JSONObject(array.getJSONObject(i));array.getJSONObject(i) 已经返回了一个 JSONObject - Scary Wombat
1
@ShubhamNaik,你认为System.out.println("OBJ: " + obj);System.out.println("OBJ: " + obj.toString());之间有什么区别吗? - Scary Wombat
显示剩余3条评论
3个回答

5

array.getJSONObject(i)已经返回了一个JSONObject类型的对象,你不需要将它传递给JSONObject类的构造函数。

只需简单地编写:

...
for (int i = 0; i < array.length(); i++) {
   JSONObject obj = array.getJSONObject(i);
   System.out.println("OBJ: " + obj);
}
...

在我的回答中,我已经解释了原始代码的行为方式,并链接到了被调用构造函数的源代码。(看起来你链接的是来自安卓的版本,它不包括那个构造函数。) - Jon Skeet
@JonSkeet 我不确定OP正在使用哪个库。无论如何,感谢您的解释。我已经编辑了我的答案。 - Raman Sahasi
@Jon Skeet 是的,我明白了,非常感谢。:) 不幸的是,我不能为您的答案投票,因为我没有15个声望点数。:( - thehespe

4
您正在调用 JSONObject(Object) 构造函数,并传入一个 JSONObject(数组中的元素)。该构造函数的文档如下:

使用 bean getter 从对象构造 JSONObject。它会反射对象的所有公共方法。对于那些没有参数且名称以 "get""is" 开头并后跟大写字母的方法,将调用该方法,并将 getter 方法返回的键和值放入新的 JSONObject 中。[...]

现在 JSONObject 本身没有任何符合 bean getter 的内容,因此您最终没有任何键。 您不希望将 JSONObject 视为 bean。

这就是为什么您的 当前 代码无法正常工作的原因。要修复它,只需不调用构造函数 - 相反,利用数组元素已经是 JSONObject 的事实即可:

JSONObject obj = array.getJSONObject(i);

该更改后的输出结果为:
OBJ: {"name":"level","value":"INFO"}
OBJ: {"name":"type","value":"Video Blocked On"}
OBJ: {"name":"cameraId","value":"722"}
OBJ: {"name":"userId","value":"1"}

1
如果您考虑以下示例,有三种方法可以实现它:
jsonString = {
   "name"  : "John",
   "sport" : "Soccer",
   "age"   : 25,
   "id"    : 100,
   "score" : [ 2, 1, 4, 5, 0, 1, 2, 3, 1]
}

使用GSON将字符串转换为JSON对象
Gson g = new Gson();
Player p = g.fromJson(jsonString, Player.class)

您还可以使用方法 toJson() 将 Java 对象转换为 JSON。
String str = g.toJson(p);

使用 JSON-Simple 将 JSON 字符串转换为 Java 对象

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

字符串转JSON - Jackson示例
Player john = new ObjectMapper().readValue(jsonString, Player.class);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接