2016-02-26 53 views
10

devo deserializzare seguente JSON utilizzando Jackson libreria in classe CustomerJackson deserializzazione di oggetti Java incorporato

{ 
    "code":"C001", 
    "city": "Pune", 
    "street": "ABC Road" 
} 

e classi come

class Address{ 
    String city; 
    String street; 
} 

class Customer{ 
    String code; 
    Address address; 
} 

ho trovato simile domanda sulla pila Java jackson embedded object deserialization

ma la risposta non si applica al mio caso. Inoltre voglio solo usare la libreria di Jackson.

Come posso mappare questo json all'oggetto Cliente?

+0

hanno u provare 'estende classe Customer address' e quindi fornire il tipo di cliente in' objectmapper.getConstructType (Customer.class) 'oggetto. questo può aiutarti .. non provato ma ti suggerisco secondo la mia esperienza .. Spero che questo possa funzionare .. –

risposta

5

È possibile inserire un'annotazione @JsonUnwrapped sul campo Address nella classe cliente. Ecco un esempio:

public class JacksonValue { 
    final static String JSON = "{\n" 
      +" \"code\":\"C001\",\n" 
      +" \"city\": \"Pune\",\n" 
      +" \"street\": \"ABC Road\"\n" 
      +"}"; 

    static class Address { 
     public String city; 
     public String street; 

     @Override 
     public String toString() { 
      return "Address{" + 
        "city='" + city + '\'' + 
        ", street='" + street + '\'' + 
        '}'; 
     } 
    } 

    static class Customer { 
     public String code; 
     @JsonUnwrapped 
     public Address address; 

     @Override 
     public String toString() { 
      return "Customer{" + 
        "code='" + code + '\'' + 
        ", address=" + address + 
        '}'; 
     } 
    } 


    public static void main(String[] args) throws IOException { 
     final ObjectMapper mapper = new ObjectMapper(); 
     System.out.println(mapper.readValue(JSON, Customer.class)); 
    } 
} 

uscita:

Customer{code='C001', address=Address{city='Pune', street='ABC Road'}} 
1

vostro oggetto JSON per un cliente dovrebbe essere simile a questo:

{ 
    "code":"C001", 
    "address":{ 
     "city": "Pune", 
     "street": "ABC Road" 
    } 
} 
+1

Grazie per la risposta. In realtà ho un codice legacy che mi dà una tale richiesta json. – vijay

+0

Ok, in questo caso dovresti deserializzare il tuo JSON in un oggetto Java corrispondente e convertirlo manualmente nel codice Java nella struttura degli oggetti richiesta come suggerito da @Boris Pavlović – eztam

1

Senza qualche trasformazione aggiuntiva tale struttura JSON non può essere mappato per due classi. Scrivi una classe CustomerAddress che avrà tutti e tre i campi da json e quindi creerà Address getAddress() e Customer getCustomer() o trasformerà il json per annidare le informazioni sull'indirizzo all'interno del campo cliente come suggerito da @eztam.

public CustomerAddress { 
    private String code; 
    private String city; 
    private String street; 

    public Address getAddress() { 
    return new Address(city, street); 
    } 

    public Address getCustomer() { 
    return new Customer(code, this.getAddress()); 
    } 
} 
1

Prova questo !!!

{ 
     "code":"customer1", 
     "address":{ 
      "type":"nested", 
      "properties":{ 
      "city":"Hyderabad", 
      "street":"1000ftRoad" 
      } 
     } 
    } 
2

Quello che ti serve è un deserializzatore personalizzato. Jackson How-To: Custom Deserializers

Per il vostro caso d'uso potrebbe essere qualcosa di simile:

class CustomerDeserializer extends JsonDeserializer<Customer> 
{ 
    public Customer deserialize(JsonParser p, DeserializationContext ctxt) 
             throws IOException, JsonProcessingException 
    { 
    JsonNode node = p.getCodec().readTree(p); 
    String code = node.get("code").asText(); 
    String city = node.get("city").asText(); 
    String street = node.get("street").asText(); 
    Address adr = new Address(city, street); 
    return new Customer(code, adr); 
    } 
} 
Problemi correlati