【问题标题】:Polymorphic deserialization Jackson issue多态反序列化杰克逊问题
【发布时间】:2016-06-15 16:07:42
【问题描述】:

Java:

/**
*/
@JsonTypeInfo(include=As.PROPERTY, property="_type", use=Id.NAME)
@JsonSubTypes({
    @JsonSubTypes.Type(value=Dog.class, name="dog"),
    @JsonSubTypes.Type(value=Cat.class, name="cat"),
    })
@ResourceName("animal");
public interface AnimalDto {

    /**
     * Stop gap property to deal with jackson not serializing type information
     * when using {@link JsonTypeInfo}
     *
     * @return A string name of the type of Animal 
     */
    @JsonProperty("_type")
}



public abstract class WildAnimal implements AnimalDto {
    private final String type;
    @Override
    public String getType(){
        return this.type;
    }
}

@JsonTypeName("dog")
public  class Dog implements WildAnimal {
}

@JsonTypeName("cat")
public  class Cat implements WildAnimal {
}

JSON:

{
    "animal": {
      "_type":"dog",
      "id": "1",
    }
}

当我试图反序列化上述对 java 的 json 响应时,jackson 会抛出以下错误。谁能帮我解决这个问题。

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property '_type' that is to contain type id  (for class Animal)
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@4b10fe3f; line: 1, column: 111]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property '_type' that is to contain type id  (for class Animal)
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@4b10fe3f; line: 1, column: 111]
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:228)
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.read(MappingJackson2HttpMessageConverter.java:220)
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:795)
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:779)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:559)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:454)

【问题讨论】:

    标签: java json jackson fasterxml jackson2


    【解决方案1】:

    你可以看到这篇文章,我想你会找到你想要的: Jackson JSON Polymorphism

    PS:小心点,你有时有“_type”,有时有“type”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2014-12-18
      • 2016-04-18
      • 1970-01-01
      • 2020-12-24
      • 2014-08-13
      相关资源
      最近更新 更多