簡體   English   中英

使用 GSON 在 Java 中創建具有不同格式的嵌套 JSON 對象

[英]Creating nested JSON objects with different formats in Java with GSON

我 100% 確定這已經被問了一百萬次了,但我真的不確定如何正確處理這個問題。 我還沒有對 JSON 或序列化它做很多事情。

基本上,這就是我想使用 GSON 創建的:

{
    "wrapper" : [
        {
            "content": "loremipsum",
            "positions": [0,3]
        },
        {
            "content": "foobar",
            "positions": [7]
        },
        {
            "content": "helloworld"
        }
    ]
}

分解它,我們有一個數組字段,其中包含對象本身包含兩個字段,其中一個映射到一個字符串,另一個映射到另一個數組,該數組可以包含未知數量的整數或可能完全丟失.

我什至無法想象如何用 GSON 得到這個結果。 到目前為止,我的想法是將所有內容都放在Map<String, List<Map<String, Object>>>野獸中並對其進行轉換,但是 Object 困擾着我,因為在這種特殊情況下它可能是字符串或列表. 可能會有演員表,但這聽起來像是一件愚蠢的復雜事情,如果我什至只是手動輸入 String.format() 或類似的東西,看起來會更容易。

難道沒有更簡單的方法來處理這些東西嗎?

我會 go 為您的數據創建一些 POJO class :

class MyData {
    private List<Data> wrapper;

    //getters setters constructors
}

class Data {
    private String content;
    private List<Integer> positions;

    //getters setters constructors
}

然后反序列化它:

Gson gson = new Gson();
String json = //json here
MyData myData = gson.fromJson(myJson, MyData.class);

對於序列化:

MyData myData = ...
String json = gson.toJson(myData);

另一種方法是使用JsonParser解析這個結構並訪問它的元素:

JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(json);
JsonElement wrapperElement = jsonElement.getAsJsonObject().get("wrapper"); //access wrapper
JsonArray array = wrapperElement.getAsJsonArray(); // access array

最好使用 Pojo 進行格式化。

class Wrapper{
 private List<Data> data;
 // geters, seters
}
class Data{
 private String content;
 private List<Integer> positions;
 // geters, seters
}

對於反序列化/序列化,您可以使用Jackson

ObjectMapper mapper = new ObjectMapper();
Wrapper wriper = mapper.readValue(dataString, Wrapper.class);
String jsonString = mapper.writeValueAsString(wriper);

Gson

Gson gson = new Gson();
Wrapper wriper = gson.fromJson(dataString, Wrapper.class);
String json = gson.toJson(wriper);

您可以使用 gson JsonElement 作為 contianer object ,它將包含 JsonElements,如 JsonObject 或 JsonArray

https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/JsonElement.html

沒有 POJO,這似乎解決了使用 Gson 的嵌套 JSON 解決方案

package com.test;

import com.google.gson.JsonObject;

public class Main {

    public static void main(String[] args) {
        
        JsonObject ex3 = new JsonObject();
        ex3.addProperty("example3", 30);
        
        JsonObject ex2 = new JsonObject();  
        ex2.add("example2", ex3.getAsJsonObject());
        
        JsonObject ex1 = new JsonObject();  
        ex1.add("example1", ex2.getAsJsonObject());
        
        System.out.println(ex1.toString());
    }       
}

output 是:

{"example1":{"example2":{"example3":30}}}

暫無
暫無

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

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