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 的实例