【问题标题】:How to map a parent attribute to a child object when deserializing JSON into Java objects?将JSON反序列化为Java对象时如何将父属性映射到子对象?
【发布时间】:2014-04-02 02:40:28
【问题描述】:

给定这样的 JSON:

{
    "locale" : "US",
    "children" : [
            {
                "foo" : "bar"
            },
            {
                "foo" : "baz"
            }
        ]
}

像这样映射到 Java 对象:

public class Parent {
    @JsonProperty public String getLocale() {...}
    @JsonProperty public List<Child> getChildren() {...}
}

public class Child {
    public void setLocale(String locale) {...}
    @JsonProperty public String getFoo() {...}
}

如何使用顶部 (Parent) 级别的 JSON 中的值填充子实例的语言环境属性?

我认为我可以在ChildsetLocale() 方法上使用@JsonDeserialize(using=MyDeserializer.class) 来使用自定义序列化程序,但这不起作用(我怀疑是因为在子级的JSON 中没有任何价值,所以Jackson 不知道应该反序列化到 locale 属性中的任何值。

我想避免为整个 Child 类编写一个完整的自定义反序列化器,实际上它需要映射更多的数据。

【问题讨论】:

    标签: java json serialization jackson deserialization


    【解决方案1】:

    如果在子对象中有对父对象的引用是可以接受的,那么您可以使用bi-directional references 在您的类之间建立父子关系。这是一个例子:

    public class JacksonParentChild {
        public static class Parent {
            public String locale;
            @JsonManagedReference
            public List<Child> children;
    
            @Override
            public String toString() {
                return "Parent{" +
                        "locale='" + locale + '\'' +
                        ", children=" + children +
                        '}';
            }
        }
    
        public static class Child {
            @JsonBackReference
            public Parent parent;
            public String foo;
    
            @Override
            public String toString() {
                return "Child{" +
                        "locale='" + parent.locale + '\'' +
                        ", foo='" + foo + '\'' +
                        '}';
            }
        }
    
        final static String json = "{\n" +
                "    \"locale\" : \"US\",\n" +
                "    \"children\" : [\n" +
                "            {\n" +
                "                \"foo\" : \"bar\"\n" +
                "            },\n" +
                "            {\n" +
                "                \"foo\" : \"baz\"\n" +
                "            }\n" +
                "        ]\n" +
                "}";
    
        public static void main(String[] args) throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            Parent parent = mapper.readValue(json, Parent.class);
            System.out.println("Dumping the object");
            System.out.println(parent);
            System.out.println("Serializing to JSON");
            System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(parent));
        }
    }
    

    输出:

    Dumping the object:
    Parent{locale='US', children=[Child{locale='US', foo='bar'}, Child{locale='US', foo='baz'}]}
    Serializing to JSON:
    {
      "locale" : "US",
      "children" : [ {
        "foo" : "bar"
      }, {
        "foo" : "baz"
      } ]
    }
    

    【讨论】:

    • 这是一个有趣的方法。我确实控制了对象模型,所以没有什么能严格阻止我这样做。但是,这不是构建对象模型的自然方式,因此我必须考虑是否值得进行权衡。
    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多