2016-02-26 184 views
10

我使用杰克逊库到Customer类杰克逊反序列化

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

和类反序列化以下JSON作为

class Address{ 
    String city; 
    String street; 
} 

class Customer{ 
    String code; 
    Address address; 
} 

我也发现了类似的问题上堆 Java jackson embedded object deserialization

但答案不适用于我的情况。另外我只想使用杰克逊库。

如何将此json映射到Customer对象?

+0

有ü尝试'一流的客户扩展Address',然后提供'objectmapper.getConstructType(Customer.Class)'对象客户类型。这可能会帮助你..没有尝试,但建议你根据我的经验..希望这可以工作.. –

回答

5

你可以把一个@JsonUnwrapped注解放在Address场在客户类。这里有一个例子:

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

输出:

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

您的客户JSON对象应该是这样的:

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

感谢您的答复。其实我有传统的代码给了我这样的JSON请求。 – vijay

+0

好的,在这种情况下,您应该在匹配的Java对象中反序列化您的JSON并将其在Java代码中手动转换为所需的对象结构,如@BorisPavlović – eztam

1

如果没有一些额外的改造此JSON结构不能被映射到两个班。要么编写一个类CustomerAddress,它将拥有json的所有三个字段,然后在其中创建Address getAddress()Customer getCustomer(),或者转换json以按照@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

试试这个!!!

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

你需要的是一个自定义的解串器。 Jackson How-To: Custom Deserializers

为您的使用情况下,它可能是这样的:

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