Json 映射异常无法从 START_ARRAY 令牌中反序列化实例

Posted

技术标签:

【中文标题】Json 映射异常无法从 START_ARRAY 令牌中反序列化实例【英文标题】:Json Mapping Exception can not deserialize instance out of START_ARRAY token 【发布时间】:2015-01-25 02:30:26 【问题描述】:

我正在尝试将我的 json 请求解析为我的模型。我不知道,这段代码有什么问题。 json 的语法看起来是正确的,Java 模型上的注释也是如此。我不知道为什么会出现如下错误:

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of ParametersType out of START_ARRAY token
(through reference chain: Document["parameters"])

Java 模型:

@JsonIgnoreProperties( ignoreUnknown = true )
public class Document 

   @XmlElement( required = true )
   @JsonProperty( "templateId" )
   protected String templateId;

   @JsonProperty( "parameters" )
   @XmlElement( required = true )
   protected ParametersType parameters;

   @JsonProperty( "documentFormat" )
   @XmlElement( required = true )
   protected DocumentFormatType documentFormat;
    
...

@JsonIgnoreProperties( ignoreUnknown = true )
public class ParametersType 

    @JsonProperty( "parameter" )
    protected List<ParameterType> parameter;
     
...

@JsonIgnoreProperties( ignoreUnknown = true )
public class ParameterType 

    @XmlElement( required = true )
    @JsonProperty( "key" )
    protected String key;

    @XmlElement( required = true )
    @JsonProperty( "value" )
    @XmlSchemaType( name = "anySimpleType" )
    protected Object value;

    @JsonProperty( "type" )
    @XmlElement( required = true, defaultValue = "STRING_TYPE" )
    protected ParamType type;

....

Json 代码:


    "templateId": "123",
    "parameters": [
        
            "parameter": [
                
                    "key": "id",
                    "value": "1",
                    "type": "STRING_TYPE"
                ,
                
                    "key": "id2",
                    "value": "12",
                    "type": "STRING_TYPE"
                
            ]
        
    ],
    "documentFormat": "PDF"

【问题讨论】:

我们在上面的代码中有参数数组。 JSON 注释将如何理解以获取正确的值?怎么说呢? 【参考方案1】:

您已将 parameters 声明为单个对象,但您在 JSON 文档中将其作为多个对象的数组返回。

您的模型当前将参数节点定义为ParametersType 对象:

@JsonProperty( "parameters" )
@XmlElement( required = true )
protected ParametersType parameters;

这意味着您的模型对象需要一个如下所示的 JSON 文档:


    "templateId": "123",
    "parameters": 
            "parameter": [
                
                    "key": "id",
                    "value": "1",
                    "type": "STRING_TYPE"
                ,
                
                    "key": "id2",
                    "value": "12",
                    "type": "STRING_TYPE"
                
            ]
        ,
    "documentFormat": "PDF"

但在您的 JSON 文档中,您将返回一个 ParametersType 对象数组。因此,您需要将模型更改为 ParametersType 对象列表:

@JsonProperty( "parameters" )
@XmlElement( required = true )
protected List<ParametersType> parameters;

您正在返回一个ParametersType 对象数组,这就是解析器抱怨无法从START_ARRAY 中反序列化对象的原因。它正在寻找一个具有单个对象的节点,但在您的 JSON 中找到了一个对象数组。

【讨论】:

【参考方案2】:

你的 pojo 类中的一些更正,

1)

公共类ParametersType

@JsonProperty( "parameter" )
protected List<ParameterType> parameter;

...

更正 POJO:

公共类参数

@JsonProperty( "parameter" )
protected List<Parameter> parameter;

...

    documentFormat 也是一个字符串,但您已将类型声明为 class , 受保护的 DocumentFormatType 文档格式; 应该是:受保护的字符串文档格式;

【讨论】:

以上是关于Json 映射异常无法从 START_ARRAY 令牌中反序列化实例的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误:无效的 JSON 输入:无法从 START_ARRAY 令牌中反序列化 Topic 实例

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

无法从START_ARRAY标记中反序列化contactupload.User的实例

无法从 START_ARRAY 令牌中反序列化 Object 的实例

无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 的实例

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