2014-04-02 56 views
0

鑑於JSON是這樣的:如何在將JSON反序列化爲Java對象時將父屬性映射到子對象?

{ 
    "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() {...} 
} 

我怎麼能填充兒童情況的locale屬性與在JSON頂部的值(Parent)等級?

我想我也許能對ChildsetLocale()方法使用自定義序列使用@JsonDeserialize(using=MyDeserializer.class),但是這不工作(我懷疑這是因爲在子級別的JSON沒有值,因此傑克遜不知道關於任何應該被反序列化到locale屬性中的值)。

我想避免必須編寫整個Child類的整個自定義解串器,實際上它有更多的數據要映射。

回答

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

這是一個有趣的方法。我確實控制了對象模型,所以沒有任何事情嚴格阻止我這樣做。然而,對象模型的結構並不是一種自然的方式,所以我不得不考慮它是否值得這種權衡。 –

相關問題