2013-05-20 13 views
7

ich JSON haben, mit differents Ebenen Feld, so möchte ich mit einer Ebene zum Beispiel auf einen einzelnen JSON mit Feldern konvertieren:Convert JSON viele Objekte auf einzelne JSON mit Jackson

{ 
    "prop1":"value1", 
    "prob2":"value2", 
    "prop3": { 
    "prop4":"value4", 
    "prop5":"value5" 
    } 
    ... many level fields 
} 

Ergebnis

{ 
    "prop1":"value1", 
    "prop2":"value2", 
    "prop4":"value4", 
    "prop5":"value5" 
    ....... 
} 

Ich benutze Jackson mit Annotation @JsonProperty("field"), ich habe kein Problem mit Feldern der ersten Ebene, aber ich weiß nicht, wie man auf das Feld in mehr JSON zugreifen, für dieses Beispiel sind prop4 und prop5.

Antwort

13

JsonUnwrapped ist die Anmerkung zu verwenden, es funktioniert sogar für Multi-Level-Verschachtelung. Zum Beispiel:

@RunWith(JUnit4.class) 
public class Sample { 

    @Test 
    public void testName() throws Exception { 
     SampleClass sample = new SampleClass("value1", "value2", new SubClass("value4", "value5", new SubSubClass("value7"))); 
     new ObjectMapper().writeValue(System.out, sample); 
    } 

    @JsonAutoDetect(fieldVisibility=Visibility.ANY) 
    public static class SampleClass { 
     private String prop1; 
     private String prop2; 
     @JsonUnwrapped 
     private SubClass prop3; 

     public SampleClass(String prop1, String prop2, SubClass prop3) { 
      this.prop1 = prop1; 
      this.prop2 = prop2; 
      this.prop3 = prop3; 
     } 
    } 
    @JsonAutoDetect(fieldVisibility=Visibility.ANY) 
    public static class SubClass { 
     private String prop4; 
     private String prop5; 
     @JsonUnwrapped 
     private SubSubClass prop6; 
     public SubClass(String prop4, String prop5, SubSubClass prop6) { 
      this.prop4 = prop4; 
      this.prop5 = prop5; 
      this.prop6 = prop6; 
     } 

    } 
    @JsonAutoDetect(fieldVisibility=Visibility.ANY) 
    public static class SubSubClass{ 
     private String prop7; 

     public SubSubClass(String prop7) { 
      this.prop7 = prop7; 
     } 
    } 
} 

wird

{"prop1":"value1","prop2":"value2","prop4":"value4","prop5":"value5","prop7":"value7"} 
+0

Große erzeugen !!! Vielen Dank für die Informationen, ist eine gute Alternative mit JsonUnwrapped, aber Notwendigkeit wird eine zweite Implementierungsklasse mit Anottation erwähnt, die nächste Frage besteht sowieso generieren alle unverpackten JSON-Felder, nur Modifikator Eigenschaften ändern? – cflores29

+0

Wenn Sie Ihre ursprüngliche Klasse nicht ändern möchten, können Sie den Mixin-Mechanismus verwenden: http://wiki.fasterxml.com/JacksonMixInAnnotations. Und nein, es gibt keine solche Funktion, die Sie auf 'ObjectMapper' aktivieren können. –