簡體   English   中英

將JSON反序列化為Java對象時,如何將父屬性映射到子對象?

[英]How to map a parent attribute to a child object when deserializing JSON into Java objects?

給定這樣的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中的值填充Child實例的locale屬性?

我以為我可能可以在ChildsetLocale()方法上使用@JsonDeserialize(using=MyDeserializer.class)以使用自定義序列化程序,但這無法正常工作(我懷疑是因為Child級別的JSON中沒有值)因此,傑克遜不知道應該反序列化到locale屬性中的任何值)。

我想避免為整個Child類編寫整個自定義反序列化器,實際上,該類有許多要映射的數據。

如果在子對象中具有對父對象的引用是可以接受的,則可以使用雙向引用在類之間建立父子關系。 這是一個例子:

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"
  } ]
}

暫無
暫無

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

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