簡體   English   中英

Jackson枚舉反序列化

[英]Jackson enum deserialization

我正在嘗試使用傑克遜反序列化json對象並獲取異常

`com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
Unrecognized field "mobile" (class mypack.JacksonPhoneBuilder), not
marked as ignorable (2 known properties: , "phoneType", "value"])  at
[Source: %filelocation%; line: 8, column: 24] (through reference
chain:
mypack.JacksonAddressListBuilder["addresses"]->mypack.JacksonAddressBuilder["phones"]->mypack.JacksonPhoneBuilder["mobile"])`

這是對象:

{
    "addresses": [
    {
        ...
        "phones": {
            "mobile": "+01234567890"
        }
    },
    ...
    ]
}

Phone.java:

@JsonDeserialize(builder = JacksonBuilder.class)
public class Phone {    
    protected String value;

    protected Type type;

    // setters and getters
}

我讀過有關傑克遜枚舉反序列化的信息,但是有一個普通的枚舉,並且使用過Map。 顯然,“移動”字段未在模型中表示,但這是一個枚舉值,那么我如何反序列化它?

JacksonPhoneBuilder的工作方式與Jackson默認的反序列化相同。 問題在於它能夠以以下形式讀取電話:

{
    "type": "mobile",
    "value": "+01234130000"
}

但是,在您的json對象中,電話被表示為子對象,在Java中可以將其視為Map<PhoneType, String> 一種可能的解決方案是使用“從映射到列表”的轉換器(我假設一個地址中可能有很多電話)。

import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.databind.util.Converter;

public class PhoneConverter implements Converter<Map<PhoneType, String>, List<Phone>>{

    public List<Phone> convert(Map<PhoneType, String> phonesMap) {
        List<Phone> phones = new ArrayList<Phone>();
        for (PhoneType phoneType : phonesMap.keySet()) {
            phones.add(new Phone(phoneType, phonesMap.get(phoneType)));
        }
        return phones;
    }

    public JavaType getInputType(TypeFactory typeFactory) {
        return typeFactory.constructMapLikeType(Map.class, PhoneType.class, String.class);
    }

    public JavaType getOutputType(TypeFactory typeFactory) {
        return typeFactory.constructCollectionLikeType(List.class, Phone.class);
    }
}

然后在您的Address類中:

public class Address {

    @JsonDeserialize(converter = PhoneConverter.class)
    protected List<Phone> phones;

}

請注意,它不會與您的構建器一起使用,但是如果您不執行任何其他自定義反序列化,則不需要它們-您可以依賴Jackson的默認行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM