2013-05-20 18 views
7

ho JSON, con il campo di livelli differenti, quindi voglio convertire in un unico JSON con campi con un livello ad esempio:Converti JSON molti oggetti a singolo JSON utilizzando Jackson

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

risultato

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

Sto usando Jackson con annotazione @JsonProperty("field"), non ho problemi con i campi di primo livello, ma non so come accedere al campo in cui più all'interno di JSON, per questo esempio sono prop4 e prop5.

risposta

13

JsonUnwrapped è l'annotazione da utilizzare, funziona anche per l'annidamento a più livelli. Per esempio:

@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; 
     } 
    } 
} 

genererà

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

Great !!! , grazie mille per l'informazione, è una grande alternativa con JsonUnwrapped, ma sarà necessario fare una seconda classe di implementazione con l'annotazione menzionata, la domanda successiva è comunque generare tutti i campi JSON non aperti, solo modificando le caratteristiche del mapper? – cflores29

+0

Se non si desidera modificare la classe originale, è possibile utilizzare il meccanismo Mixin: http://wiki.fasterxml.com/JacksonMixInAnnotations. E no, non esiste alcuna funzione che è possibile attivare su 'ObjectMapper' che lo farà. –

Problemi correlati