将字符串转换为json不起作用java

Posted

技术标签:

【中文标题】将字符串转换为json不起作用java【英文标题】:Convert string to json doesn't work java 【发布时间】:2017-10-09 23:42:26 【问题描述】:

我在将字符串转换为 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 is "",四次。所以这是正确的,因为数组有4个元素,但为什么它是空对象?我正在使用 org.json。

谢谢

【问题讨论】:

试试obj.toString(); api。 @ShubhamNaik 为什么你认为这会起作用? 它应该打印对象描述,也许我们可以得到一些关于正在发生的事情的细节。 OP 你为什么要做new JSONObject(array.getJSONObject(i));array.getJSONObject(i) 已经返回 JSONObject @ShubhamNaik 你认为System.out.println("OBJ: " + obj);System.out.println("OBJ: " + obj.toString ()); 之间有什么区别吗? 【参考方案1】:

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

简单写

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

...

【讨论】:

在我的回答中,我已经解释了为什么原始代码的行为方式,以及链接到被调用的构造函数的源代码。 (看起来您链接到的 android 可用版本不包括该构造函数。) @JonSkeet 我不确定 OP 使用的是哪个库。无论如何,感谢您解释它。我已经编辑了我的答案。 @Jon Skeet 是的,我明白了,非常感谢。 :) 不幸的是,我不能为你的答案投票,因为我没有 15 个声望点。 :(【参考方案2】:

您正在调用JSONObject(Object) 构造函数,传入JSONObject(数组中的元素)。该构造函数记录为:

使用 bean getter 从 Object 构造 JSONObject。它反映在 对象的所有公共方法。对于每个没有的方法 参数和以"get" 开头的名称或 "is"后跟一个大写字母,调用方法, 并且将一个键和从 getter 方法返回的值放入 新的 JSON 对象。 [...]

现在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"

【讨论】:

【参考方案3】:

如果您考虑以下示例,您可以通过 3 种方式进行:

jsonString = 
   "name"  : "John",
   "sport" : "Soccer",
   "age"   : 25,
   "id"    : 100,
   "score" : [ 2, 1, 4, 5, 0, 1, 2, 3, 1]

字符串到 JSON 对象使用 GSON

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);

【讨论】:

以上是关于将字符串转换为json不起作用java的主要内容,如果未能解决你的问题,请参考以下文章

将 Map 转换为 json 字符串颤振

将字符串转换为 JSON 对象

将字节数组转换为字符串在c#中不起作用

如何将数据框列转换为字符串并替换 nans(fillna 不起作用)

如何使用 Jackson JSON 将 JSON 字符串转换为 Map<String, String>

有没有办法将 json 对象转换为 json l 文件