2014-01-29 513 views
0

的Java class JSONObject轉換JSON對象到另一個JSON對象在Java中

我有一個JSON對象,從中我想只提取了一些鍵/值對到另一個JSON對象。另外,我想更改提取的鍵的名稱。最後,我想讓輸出對象爲「平坦」(即,所有元素深度爲1)。

例如:

輸入對象:

{ 
    "a":"val_a", 
    "b": 
    { 
     "b1":"val_b1", 
     "b2":"val_b2" 
    }, 
    "c": 
    { 
     "c1":"val_c1", 
     "c2": 
     { 
      "c21":"val_c21", 
      "c22":"val_c22" 
     } 
    } 
} 

輸出對象:

{ 
    "x":"val_a", 
    "y":"val_b1", 
    "z":"val_c22" 
} 

什麼是最好的( 「清潔」)的方式來實現這一點?

目前,我提取領域的一個個「手動」,像這樣(在上面的例子):

JSONObject output = new JSONObject(); 
output.put("x",input.getString("a")); 
output.put("y",input.getJSONObject("b").getString("b1")); 
output.put("z",input.getJSONObject("c").getJSONObject("c2").getString("c22")); 

是否有某種「正則表達式」,這將有助於我的在「一杆」中實現這一點?

對於給定示例的答案將不勝感激。

感謝

+0

你有沒有考慮使用谷歌GSON庫? – Alessio

+0

我還沒有,但我寧願「儘可能少地導入」。這個庫會來**而不是我已經使用的JSON庫,或**此外**?謝謝。 –

回答

1

一種替代的方法是使用JSON in Java框架來改變你的JSON對象轉換爲Java,執行操作,並且產生新的JSON對象。

編輯:對不起,誤會。

你應該真的去一個框架,如推薦的一個或@Alessio。雖然這應該可能通過使用正則表達式,個人,我會建議它,因爲您正在尋找的嵌套和/或對象的變化可能會導致正則表達式本身的重大變化。因此,雖然正則表達式可以更快地完成工作,但它可能不具有可讀性和可維護性。

+0

謝謝。我**我**使用'JSONObject'類(假設這就是你的意思)。我手動逐個提取字段,並且我認爲可能存在某種「正則表達式」,這會幫助我在「一次性」中實現它。 –

+0

@barakmanos:抱歉誤會,我更新了我的答案,以更好地回答你的問題。 – npinti

+0

謝謝;這對我來說很有意義,因爲我認爲正確的表達對我來說很難在未來繼續保持;將等待,看看是否有更多的答案出現,並會接受你的,如果沒有更好的意見提供。再次感謝:) –

1

有一些框架,可能會幫助你實現你正在尋找的東西。問題在於,對於像這樣的簡單工作,它們太複雜了。

您可能會看到Apache Camel,YQL,QL.IO, Teiid,Stardust。它們都是用於不同級別數據虛擬化/集成的框架,並且可以完成這項工作。問題在於你是否真的需要這樣的基礎設施,以及你有多少數據轉​​換?

如果您只有此轉換,那麼我會建議您使用GSONApache Camel

1

您可以使用JsonPath來避免低級別的JSONObject API調用。

添加maven的依賴性:

<dependency> 
    <groupId>com.jayway.jsonpath</groupId> 
    <artifactId>json-path</artifactId> 
    <version>2.2.0</version> 
</dependency> 

解析從字符串/文件/ URL /的InputStream您的JSON:

DocumentContext doc = JsonPath.parse(String|File|URL|InputStream data); 

然後你就可以使用任意的點或關鍵符號,取其你喜歡:

String title = doc.read("$.store.book[0].title"); 

String title = doc.read("$['store']['book'][0]['title']"); 

與XPath中的//類似,您可以使用..來獲取樹中任何位置的子節點。

該API還允許在DocumentContext中映射和重命名元素。

查看更多: