2017-05-07 79 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)? –