繁体   English   中英

在Java中反序列化/解析JSON

[英]Deserialize/Parse JSON in Java

我正在寻找一种很好的 动态方式来解析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"];

我希望有人能理解我的问题并能为我提供帮助。 提前致谢!

核心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

在Java领域,“正确”的方法是创建一个代表您的JSON模型的类(或一组类),并将其传递给JSON解析器的“对象映射器”。 但是您说的是“动态”,所以我不在这里探讨。 因此,当您知道它不是原始值时,需要将其((Map<String,Map<String,String>>)map.get("monday")).get("1").get("subject");((Map<String,Map<String,String>>)map.get("monday")).get("1").get("subject");

这行得通,但警告未选中的演员表...

总而言之,Java并不是一种动态语言,而且我看不到有什么方法可以准确地实现您想要的(也许我错过了比我建议的方法还要容易一些的方法)。

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

编辑:一个有趣的替代方法是使用Java自己的JavaScript实现。 这是可行的,并且容易且动态,但是我不知道它是否“好”:

    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']"));

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

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库。

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

非常适合解析JSON对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM