2015-06-11 33 views
0

我有以下中的Java字符串對象(其JSON)(其漂亮的印刷所以它是清晰):如何在java中快速提取json字段?

{ 
    name: John, 
    age: { 
    years:18 
    }, 
    computer_skills: { 
    years:4 
    }, 
    mile_runner: { 
    years:2 
    } 
} 

我有100人具有相同的結構的陣列。

通過全部100人並使其不再有「年」的最佳方式是什麼?換句話說,在100的每個對象看起來是這樣的:

{ 
    name: John, 
    age:18, 
    computer_skills:4, 
    mile_runner:2 
} 

在Python中,我可以做一些瑣碎的這樣的僞代碼:

// Iterates through each person 
    for person in persons: 
// Iterates through each key/value pair k,v 
     for k, v in person.items(): 
      // check if the value is an object {} 
      if isinstance(v, dict) and 'years' in v: 
       if the value is an object, and there is 'years' as a key nested within, then set the key k to have the value of the nested 'years' field 
       person[k] = v['years'] 

最後,我希望能夠寫出「人物」退出爲(json的)字符串形式。

有沒有一種簡單而有效的方法在java中做到這一點?如果可能的話,我寧願不創建一個代表我的對象中的每個字段的模型對象,因爲我喜歡我不需要在python中執行該操作(除非我必須因爲它的Java)。

我喜歡你如何迭代,檢查一個對象是否有嵌套的字段'年',如果它確實,然後提高它!它看起來很直接。

+0

如果你不喜歡使用對象,你可以使用'Map '。請記住,Java是一種面向對象的語言...... – alfasin

+0

您能否將我的問題的示例顯示爲答案?我來自Python背景,所以我不太清楚你的意思。 – Rolando

回答

0

您可以使用JSON解析器包返回可工作的對象,例如, quick-jsonorg.jsonas shown here。您可能需要更新下面的代碼來處理您返回的特定對象,但仍然適用相同的一般模式。上面的鏈接包含如何使用這些庫的示例。您使用的是Map<String,Object>或類似的東西,那age也是Map<String,Object>

假設,你的答案會是這個樣子:

class MyClass { 

    // This changes depending on your entry point, e.g. it's different on Tomcat/JBoss 
    public static void main(String[] args) { 
     // get array of maps using JSON parser ... 

     for(Map<String,Object> map:myMapArray) { 
      // change value 
      map.put('age', ((Map<String,Object>) map.get('age')).get('years')); 
     } 

     // do other stuff... 
    } 
} 

這不一定是最好的做法,所以你可能需要使用一個DTO類代替。

+0

不知道如何迭代可以配合這一點。這看起來非常「手動」。我需要爲每個可能具有該字段的字段設置一個map.put,並將其嵌套在它們的數組中....不知道這個答案是如何表示的。有沒有辦法「檢查」以查看根級別鍵的值是否是嵌套對象?我的字符串(包含json)如何轉換爲「地圖數組」以開始? – Rolando

+0

@Rolando我更新了這個例子來處理一個Map對象數組。你也可以使用'ArrayList'這個代碼,這取決於你從解析JSON中得到的任何東西。 – Barbarrosa

+0

你能告訴我如何能夠將包含json對象的初始字符串轉換爲「Map」開始?在python中,我只是使用json.dumps(字符串)將其轉換爲完全可訪問的對象。有沒有在java中做同樣的事情? – Rolando

0

Java使用面向對象編程(OOP),這種模式的要點是使用對象

你可以做的最好的事情是這樣的:

class Person { 
    private String name; 
    private Integer age; 
    private Integer computerSkills; 
    private Integer mileRunner; 

    /** getters and setters **/ 

    @Override 
    public String toString(){ 
     return "{name: "+name+", age:"+age+", 
       computer_skills:"+computerSkills+", mile_runner:"+mileRunner+"}"; 
    } 

然後你fullfill你的對象,並取回您的數據只是調用toString()方法。

+0

這看起來不像是以編程方式修改嵌套的「年份」鍵,並沒有回答問題。你如何以編程方式實現? – Rolando