簡體   English   中英

在Java中將JSON對象轉換為另一個JSON對象

[英]Convert a JSON object to another JSON object in Java

Java class JSONObject

我有一個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"));

是否有某種“正則表達式”可以幫助我“一次完成”?

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

謝謝

一種替代方法是在Java框架中使用JSON將JSON對象轉換為Java,執行操作並生成新的JSON對象。

編輯:抱歉造成誤會。

您確實應該選擇一個推薦的框架,例如@或@Alessio。 盡管這應該可以通過使用正則表達式來完成,但就個人而言,我還是建議要這樣做,因為您要查找的嵌套和/或對象的更改可能會導致正則表達式本身發生很大的更改。 因此,盡管正則表達式可以更快地完成工作,但它可能不那么易讀和可維護。

有一些框架可以幫助您實現所需的目標。 問題在於它們對於像這樣的簡單工作來說太復雜了。

您可以看看Apache CamelYQLQL.IOTeiidStardust 它們都是用於不同級別的數據虛擬化/集成的框架,並且可以完成任務。 問題是,您是否真的需要這樣的基礎架構?您真正擁有多少個數據轉換?

如果只有這種轉換,那么我建議您使用GSONApache Camel

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

添加Maven依賴項:

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

從String / File / 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中映射和重命名元素。

查看更多:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM