简体   繁体   English

嵌套到映射为动态密钥的Jackson的JSON映射

[英]Nested JSON Mapping to Jackson where key is dynamic

I am looking to map a nested JSON structure into Jackson where the object is an object of dynamic IDs. 我正在寻求将嵌套的JSON结构映射到Jackson中,其中该对象是动态ID的对象。

{ 
     "id1": {
          "prop": true
     },
     "id2": {
          "prop": true
     },
     "id3": {
          "prop": true
     }
 }

I currently have the following Jackson POJO: 我目前有以下Jackson Jackson:

package com.uk.jacob.containerdroid;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;

import java.util.HashMap;
import java.util.Map;

public class Container {
    private Map<String, ContainerDetails> properties = new HashMap<>();

    public class ContainerDetails {
        private boolean prop;

        public boolean getProp() {
            return prop;
        }

        public void setProp(boolean prop) {
            this.prop = prop;
        }
    }

    @JsonAnySetter
    public void add(String key, ContainerDetails value) {
        properties.put(key, value);
    }

    @JsonAnyGetter
    public Map<String, ContainerDetails> getProperties() {
        return properties;
    }

    @Override
    public String toString() {
        return "Containers {" +
                    ", properties=" + properties.toString() +
                '}';
    }
}

Which works for data that is a static property, but not nested JSON. 适用于属于静态属性但不适用于嵌套JSON的数据。

I get the error: 我收到错误:

12-23 22:32:41.628  14098-14098/? W/System.err﹕ at [Source: { "test": { "prop": true } }; line: 1, column: 13] (through reference chain: com.uk.jacob.containerdroid.models.Container["test"])

How can I manipulate the above to map properly? 如何操纵以上内容以正确映射?

It seems you just want a Map<String, Foo> , where Foo is defined as 似乎您只想要Map<String, Foo> ,其中Foo被定义为

public class Foo {
    private boolean prop;

    // getter, setter omitted
}

Complete working example: 完整的工作示例:

import java.io.IOException;
import java.util.Map;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Foo {
    private boolean prop;

    public boolean isProp() {
        return prop;
    }

    public void setProp(boolean prop) {
        this.prop = prop;
    }

    @Override
    public String toString() {
        return "Foo{" +
            "prop=" + prop +
            '}';
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{ \n" +
            "     \"id1\": {\n" +
            "          \"prop\": true\n" +
            "     },\n" +
            "     \"id2\": {\n" +
            "          \"prop\": true\n" +
            "     },\n" +
            "     \"id3\": {\n" +
            "          \"prop\": true\n" +
            "     }\n" +
            " }";
        Map<String, Foo> map = mapper.readValue(json, new TypeReference<Map<String, Foo>>() {
        });

        System.out.println("map = " + map);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM