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

2022-09-03 01:34:00

我正在尝试将我的 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"
}

答案 1

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

您的模型当前将参数节点定义为对象: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)

公共类参数类型 {

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

...}

更正的 POJO:

公共类参数 {

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

...}

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