web-dev-qa-db-ja.com

Json Mapping ExceptionはSTART_ARRAYトークンからインスタンスをデシリアライズできません

モデルへの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"
}
14
Marcin Erbel

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でオブジェクトの配列を見つけました。

19
gregwhitaker