2016-02-26 12 views
10

ich folgende json mit Jackson-Bibliothek in Customer-KlasseJackson Deserialisierung von Embedded Java Object

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

und Klassen als

class Address{ 
    String city; 
    String street; 
} 

class Customer{ 
    String code; 
    Address address; 
} 

Ich habe auf Stapel ähnliche Frage gefunden deserialisieren haben Java jackson embedded object deserialization

aber die Antwort gilt nicht für meinen Fall. Auch ich möchte nur Jackson Bibliothek verwenden.

Wie kann ich diesen JSON zu Customer Objekt zuordnen?

+0

haben u versuchen 'Klasse Kunde erweitert address' und dann Kundentyp in' objectmapper.getConstructType (Customer.class) 'Objekt zur Verfügung stellen. Dies kann Ihnen helfen .. nicht versucht, aber schlagen Sie mir nach meiner Erfahrung .. Hoffe, das kann funktionieren .. –

Antwort

5

Sie eine @JsonUnwrapped Anmerkung auf dem Address Feld in der Kunden-Klasse setzen. Hier ein Beispiel:

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

Ausgang:

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

Ihr JSON-Objekt für einen Kunden soll wie folgt aussehen:

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

Vielen Dank für die Antwort. Eigentlich habe ich Legacy-Code, der mir solche JSON-Anfrage gibt. – vijay

+0

Ok, in diesem Fall sollten Sie Ihren JSON in einem passenden Java-Objekt deserialisieren und in Ihrem Java-Code manuell in die erforderliche Objektstruktur konvertieren, wie von @Boris Pavlović vorgeschlagen – eztam

1

Ohne eine zusätzliche Transformation dieser json Struktur kann nicht in zwei Klassen zugeordnet werden. Schreiben Sie entweder eine Klasse CustomerAddress, die alle drei Felder von json haben wird, und erstellen Sie dann Address getAddress() und Customer getCustomer() oder transformieren Sie den JSON, um die Adressinformationen im Kundenfeld wie von @eztam vorgeschlagen zu verschachteln.

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

Versuchen Sie das !!!

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

Was Sie brauchen, ist eine benutzerdefinierte Deserializer. Jackson How-To: Custom Deserializers

Für Ihren Anwendungsfall könnte es so etwas wie dieses:

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); 
    } 
} 
Verwandte Themen