簡體   English   中英

從JSON反序列化復雜的地圖結構

[英]Deserializing complex map structure from JSON

我有一個像這樣的JSON結構:

[
    {
        "topLevelOne": {
            "property1": false,

        },
        "topLevelTwo": [
            {
                "property2": false,
                "property3": false,
                "property4": false,
            },
            {
                "property2": false,
                "property3": false,
                "property4": false,
            }
        ]
    },

    {
        "topLevelOne": {
            "property1": false,

        },
        "topLevelTwo": [
            {
                "property2": false,
                "property3": false,

            },
            {
                "property2": false,
                "property3": false,
            },
        ]
    }
]

我試圖將這個結構與Jackson轉換為Map<CustomObject, List<CustomObject>> ,其中topLevelOneKey ,值為topLevelTwoList<CustomObject>

所以我嘗試了這個:

ObjectMapper JSONMapper = new ObjectMapper();
Map<CustomObject, List<CustomObject>> map = JSONMapper.readValue(json, new TypeReference<Map<CustomObject, List<CustomObject>>>(){});

但是我收到此錯誤消息: com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class CustomObject ] com.fasterxml.jackson.databind.JsonMappingException: Can not find a (Map) Key deserializer for type [simple type, class CustomObject

誰能指出我在這里做錯了什么? 也許一個代碼示例如何實現這一目標?

json無效,因為您在結構中具有相同級別的混合類型。 我想你可以通過地圖地圖完成你想要的任務。 我不確定你的自定義對象,所以我會使用字符串以防萬一。

如果你像這樣定義你的json:

[{
        "topLevelOne": [{
            "property1": false
        }],
        "topLevelTwo": [{
                "property2": false,
                "property3": false,
                "property4": false
            },
            {
                "property2": false,
                "property3": false,
                "property4": false
            }
        ]
    },

    {
        "topLevelOne": [{
            "property1": false

        }],
        "topLevelTwo": [{
                "property2": false,
                "property3": false

            },
            {
                "property2": false,
                "property3": false
            }
        ]
    }
]

你可以用這樣的東西讀它:

Map<String, Map<String,String>> map = mapper.readValue(json, new TypeReference <Map<String, Map<String,String>>>(){});

內置的Jackson Map反序列化器使用字段名稱作為鍵並將它們映射到相關的字段值。

你的json結構不同 - 它是一個條目列表。 反序列化地圖的最簡單方法是讀取列表並在之后構建地圖。

您需要一個輔助對象來為條目建模:

class CustomEntry {
    private CustomKey topLevelOne;
    private List<CustomObject> topLevelTwo;

    @JsonCreator
    public CustomEntry(@JsonProperty("topLevelOne") CustomKey topLevelOne, @JsonProperty("topLevelTwo") List<CustomObject> topLevelTwo) {
        this.topLevelOne = topLevelOne;
        this.topLevelTwo = topLevelTwo;
    }

    public CustomKey getTopLevelOne() {
        return topLevelOne;
    }

    public List<CustomObject> getTopLevelTwo() {
        return topLevelTwo;
    }
}

然后,

String json = ...
ObjectMapper mapper = new ObjectMapper();
// Read the list of map entries
List<CustomEntry> entries = mapper.readValue(json, new TypeReference<List<CustomEntry>>(){});
// Build the map
Map<CustomKey, List<CustomObject>> map = entries.stream().collect(Collectors.toMap(e -> e.topLevelOne, e -> e.topLevelTwo));

您可以創建一個自定義反序列化器直接從列表中讀取地圖,但我不確定是否值得付出額外的努力。

暫無
暫無

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

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