Jackson 反序列化意外令牌(END_OBJECT),

Posted

技术标签:

【中文标题】Jackson 反序列化意外令牌(END_OBJECT),【英文标题】:Jackson deserialization Unexpected token (END_OBJECT), 【发布时间】:2011-11-22 02:39:25 【问题描述】:

我正在尝试在一个抽象类“Animal”上使用 Jackson 注释将 JSON 对象反序列化为 Java 对象:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")  
@JsonSubTypes(@Type(value = Dog.class, name = "chien"),
@Type(value = Cat.class, name= "chat")) 

这是一个示例 JSON 字符串:


    "name": "Chihuahua",
    "type": 
                "code": "chien",
                "description": "Chien mechant"
            

问题是JSON对象中的属性“type”也是一个对象。当我尝试反序列化时,我有这个异常:

Caused by: org.codehaus.jackson.map.JsonMappingException: Could not resolve type id '' into a subtype of [simple type, class Animal]

我尝试使用“type.code”作为“属性”值,但没有。例外是这个

Caused by: org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type.code' that is to contain type id  (for class Animal)

知道出了什么问题。谢谢。

【问题讨论】:

【参考方案1】:

我是 jackson 的初学者,但我认为您必须像 here 解释的那样搜索树解析

【讨论】:

【参考方案2】:

在没有找到解决此问题的方法后将其扔出去。如果任何偶然发现这一点的人感兴趣,我就会想出我自己的风格。如果您找到其他方法,请随意添加您自己的解决方案。

我在枚举中实现了解决此问题的方法是添加一个 findByType 方法,该方法允许您搜索枚举键值的字符串表示形式。 因此,在您的示例中,您有一个带有键/值对的枚举,

pubilc enum MyEnum  
...
CHIEN("chien", "Chien mechant")
...

// Map used to hold mappings between the event key and description
private static final Map<String, String> MY_MAP = new HashMap<String, String>();

// Statically fills the #MY_MAP.
static 
    for (final MyEnum myEnum: MyEnum.values()) 
        MY_MAP.put(myEnum.getKey(), myEnum);
    

然后您将拥有一个公共方法 findByTypeCode,该方法将返回您搜索的键的类型:

public static MyEnum findByKey(String pKey) 
    final MyEnum match = MY_MAP.get(pKey);
    if (match == null) 
        throw new SomeNotFoundException("No match found for the given key: " + pKey);
    
    return match;

我希望这会有所帮助。就像我说的那样,可能有一个直接解决这个问题的解决方案,但我还没有找到一个解决方案,并且当它运行良好时不需要浪费更多时间寻找解决方案。

【讨论】:

添加这个会起作用@JsonIgnoreProperties(ignoreUnknown = true)

以上是关于Jackson 反序列化意外令牌(END_OBJECT),的主要内容,如果未能解决你的问题,请参考以下文章

Jackson 错误:无法从 START_ARRAY 令牌中反序列化 `java.lang.String` 的实例

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 START_OBJECT 令牌中反序列化 `java.util.Arra

理解异常的麻烦:“无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例”在 Jackson 中使用 ObjectMapper

使用 Jackson 和消息解析 JSON 文件中的内容时出现问题 - JsonMappingException - 无法反序列化为超出 START_ARRAY 令牌

com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从START_ARRAY令牌中反序列化Object的实例

无法从 Spring Webservice 中的 START_ARRAY 令牌反序列化对象实例