在Java中反序列化/解析JSON

时间:2017-05-07 09:54:31

标签: java c# json

我正在搜索良好动态方式来解析Java中的JSON。 我见过这样的事情:

List<String> list = new ArrayList<String>();
JSONArray array = obj.getJSONArray("test");
for(int i = 0 ; i < array.length() ; i++){
    list.add(array.getJSONObject(i).getString("testKey"));
}

但那是我正在搜索的内容。在C#中我有类似的东西:

dynamic results = JsonConvert.DeserializeObject<dynamic>(json); 
info.Text = results["test"]["testKey"];

以下是我的JSON示例:

{"date":"07.05.2017 11:44",
"monday":{"1":{"subject":"test","room":"test","status":"test"}}}

所以我想做一下:

results["monday"]["1"]["subject"];

我希望有人了解我的问题并且可以帮助我。 提前谢谢!

3 个答案:

答案 0 :(得分:1)

核心Java运行时不提供JSON解析器(编辑:技术上,它确实如此,请参阅答案的底部),因此您将需要一个库。见杰克逊,格森,也许还有其他人。

即使这样,您也无法获得所需的动态功能,因为Java是静态类型的。杰克逊的例子:

    ObjectMapper mapper = new ObjectMapper();
    Map<String, Object> map = mapper.readValue(json, new TypeReference<Map<String, Object>>(){});

    map.get("monday").get("1").get("subject");
                      ^^^
                      This fails because the result of get("monday") is Object, not Map

&#34;对&#34; Java-land中的方法是创建一个表示JSON模型的类(或类集),并将其传递给JSON解析器&#34;对象映射器&#34;。但你说&#34;动态&#34;所以我不在这里探讨这个问题。 因此,当您知道它不是原始值时,您需要转换为Map:       ((Map<String,Map<String,String>>)map.get("monday")).get("1").get("subject");

这有效但有关未经检查的演员的警告......

总而言之,Java不是一种动态语言,我认为没有办法完全按照你的意愿行事(也许我错过的方法仍然比我建议的稍微容易一些)。

您是否仅限于Java-the-language或Java-the-platform?在后一种情况下,您可以使用Java平台的动态语言,例如Groovy,它具有解析JSON的出色功能。

编辑:一个有趣的选择是使用Java自己的JavaScript实现。这很有效,而且很容易动态,但我不知道它是不是很好&#34;:

    String json = "{\"date\":\"07.05.2017 11:44\",\n" +
            "\"monday\":{\"1\":{\"subject\":\"test\",\"room\":\"test\",\"status\":\"test\"}}}";
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    engine.put("data", json);
    System.out.println(engine.eval("JSON.parse(data)['monday']['1']['subject']"));

答案 1 :(得分:1)

如果您确定要获得的价值,那么您也可以执行以下操作:

String str = "{\"date\":\"07.05.2017 11:44\", \"monday\":{\"1\":{\"subject\":\"test\",\"room\":\"test\",\"status\":\"test\"}}}";
JSONObject results= new JSONObject(str);
String str1 = results.getJSONObject("monday").getJSONObject("1").getString("subject");
System.out.println(str1);

对于数组类型的结果,我们必须为此编写逻辑。在这种情况下,使用 org.json 库。

答案 2 :(得分:0)

您可以使用GCON库: https://github.com/google/gson

非常适合解析JSON对象。