簡體   English   中英

Jackson - 帶有列表的 Java 對象<Map<String,String> &gt; 到 Json 字符串轉換

[英]Jackson - Java Objects with List<Map<String,String>> to Json String conversion

我想從 Java 對象生成 JSON 字符串

public class Resource {

String name;
List<Item> items;

public String resourceAsJson(Resource resource) throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    return objectMapper.writeValueAsString(resource);
}

哪里項目

public class Item {
    Map<String, String> systemFields;
    Map<String, String> dataFields;
}

此時 JSON String 的形式是

{
"name": "Person",
"items": [
    {
        "systemFields": {
            "systemField1": "xxx",
            "systemField2": "xxx",
            "systemField3": "x"
        },
        "dataFields": {
            "dataField1": "xxx",
            "dataField2": "xxx",
            "dataField3": "x"
        }
    }
    ]
}

我試圖獲得的是不同形式的 JSON(省略 Item 並在一個 Json 表中有“系統字段”“數據字段”)

{
"Person":[
        {
        "systemField1": "xxx",
        "systemField2": "xxx",
        "systemField3": "Warsaw",
        "dataField1": "xxx",
        "dataField2": "xxx",
        "dataField3": "xxx"
        }
    ]
}

有沒有辦法在不改變模型的情況下用傑克遜做到這一點?

在這種情況下, POJO默認表示不是您想要的,您需要實現自定義序列化程序。 在您的情況下,它們可能如下所示:

class ResourceJsonSerializer extends JsonSerializer<Resource> {
    @Override
    public void serialize(Resource value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        gen.writeFieldName(value.getName());
        gen.writeObject(value.getItems());
        gen.writeEndObject();
    }
}

class ItemJsonSerializer extends JsonSerializer<Item> {

    @Override
    public void serialize(Item value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        gen.writeStartObject();
        writeMap(value.getSystemFields(), gen);
        writeMap(value.getDataFields(), gen);
        gen.writeEndObject();
    }

    private void writeMap(Map<String, String> map, JsonGenerator gen) throws IOException {
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                gen.writeStringField(entry.getKey(), entry.getValue());
            }
        }
    }
}

您可以使用com.fasterxml.jackson.databind.annotation.JsonSerialize注釋注冊它們:

@JsonSerialize(using = ResourceJsonSerializer.class)
class Resource {

和:

@JsonSerialize(using = ItemJsonSerializer.class)
class Item {

暫無
暫無

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

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