[英]Jackson Deserialization of Embedded Java Object
我必須使用Jackson庫將json反序列化為Customer類
{
"code":"C001",
"city": "Pune",
"street": "ABC Road"
}
和類作為
class Address{
String city;
String street;
}
class Customer{
String code;
Address address;
}
我在堆棧Java jackson嵌入式對象反序列化中發現了類似的問題
但答案不適用於我的情況。 另外我只想使用傑克遜圖書館。
如何將此json映射到Customer對象?
您可以在客戶類的“ Address
字段中放置@JsonUnwrapped注釋。 這是一個例子:
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'}}
您需要的是自定義反序列化器。 Jackson How-To:定制反序列化器
對於您的用例,它可能是這樣的:
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);
}
}
您的客戶JSON對象應如下所示:
{
"code":"C001",
"address":{
"city": "Pune",
"street": "ABC Road"
}
}
如果沒有一些額外的轉換,這個json結構就不能映射到兩個類。 編寫將擁有json中所有三個字段的類CustomerAddress
,然后在其中創建Address getAddress()
和Customer getCustomer()
,或者轉換json以按照@eztam的建議將地址信息嵌套在customer字段中。
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"
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.