gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:51:09 25 4
gpt4 key购买 nike

我正在寻找一种好的动态的方法来用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com