2017-05-07 49 views
0

我在寻找一个好的dynamic解析Java中的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"]; 

我希望有人理解我问题,并可以帮助我。 在此先感谢!

+0

对于您的文章中的第一个示例,您不喜欢什么? – ItamarG3

+0

@ItamarGreen,因为我必须添加每一个键/对象,这真的很烦人..我只是想要一个动态的方式来获取这个JSON-Keys,就像使用C#或PHP。 – iMostLiked

+0

Java中有许多Json解析器。每个人都有自己的能力。但是Java不是C#,你不能拥有数组的字符串索引。无论如何,你正在比较桔子和苹果 - 在你的Java例子中,你正在解析一个Json数组,而在C#示例中,你正在解析一个Json对象。 – RealSkeptic

回答

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 

在Java的土地“正确”的方式,将创建一个代表你的JSON模型类(或一组类),并把它传递给JSON解析器的“对象映射器” 。但你说“动态”,所以我不在这里探索。 所以你需要转换为地图,当你知道它不是原始值: ((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']")); 
+0

谢谢! '((Map >)map.get(“monday”))。get(i).get(“subject”)'运行良好。正是我想要的。 :) – iMostLiked

+0

如果你感兴趣,我用eaven“更容易”的方式进行编辑... –

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

+0

啊,很好,我错过了那个,它可能是动态的。虽然图书馆被称为“GSON”。 –

+0

GSON是JSON解析的另一个库,我使用的是不同的解析库。 –

+0

哦... [那个](https://github.com/stleary/JSON-java)? –