java - 在 Java 中反序列化/解析 JSON

标签 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"];

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

最佳答案

核心 Java 运行时不提供 JSON 解析器(编辑:从技术上讲,它提供,请参见答案底部),因此您将需要一个库。参见 Jackson、Gson,或许还有其他人。

即使这样,您也不会获得您想要的动态功能,因为 Java 是静态类型的。以 jackson 为例:

    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: ((Map<String,Map<String,String>>)map.get("monday")).get("1").get("subject");

这有效,但有一个关于未经检查的 Actor 的警告...

总而言之,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']"));

关于java - 在 Java 中反序列化/解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43830111/

相关文章:

java - 如何使用 Javascript 调用 Java applet 方法?

c# - 将文件上传到 FTPS 服务器

c# - 从 Controller 中获取 Controller 和 Action 名称?

c# - JSON 主体未被 NancyModule 反序列化

json - RxSwift 可观察到的错误停止链 - 使用 Rx 的 Web 服务,如何恢复?

php - 不同的 JSON 响应 - {"count":"123"} vs {"count"= >"123"}

java - 将 RGBA、HSL 和 HSLA 颜色转换为 RGB(或在 java.awt.Color 对象中)

java - 如何使用 setMaxResults 更新 hibernate 查询?

java - 检查字符串是否有允许值以外的值。 java

c# - 在 c# Specflow 中断言 Json 输出