杰克逊反序列化
问题描述:
我使用杰克逊库到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对象?
答
你可以把一个@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'}}
答
如果没有一些额外的改造此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());
}
}
答
试试这个!!!
{
"code":"customer1",
"address":{
"type":"nested",
"properties":{
"city":"Hyderabad",
"street":"1000ftRoad"
}
}
}
答
你需要的是一个自定义的解串器。 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);
}
}
有ü尝试'一流的客户扩展Address',然后提供'objectmapper.getConstructType(Customer.Class)'对象客户类型。这可能会帮助你..没有尝试,但建议你根据我的经验..希望这可以工作.. –