web-dev-qa-db-fra.com

L'exception de mappage Json ne peut pas désérialiser l'instance hors du jeton START_ARRAY

J'essaie d'analyser ma demande json à mon modèle. Je ne sais pas ce qui ne va pas dans ce code. La syntaxe de json semble correcte et les annotations sur Java également. Je ne sais pas pourquoi je reçois une erreur comme:

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

Modèle 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;

....}

Code Json:

{
    "templateId": "123",
    "parameters": [
        {
            "parameter": [
                {
                    "key": "id",
                    "value": "1",
                    "type": "STRING_TYPE"
                },
                {
                    "key": "id2",
                    "value": "12",
                    "type": "STRING_TYPE"
                }
            ]
        }
    ],
    "documentFormat": "PDF"
}
14
Marcin Erbel

Vous avez déclaré parameters comme un seul objet, mais vous le renvoyez sous la forme d'un tableau de plusieurs objets dans votre document JSON.

Votre modèle définit actuellement le nœud de paramètres comme un objet ParametersType:

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

Cela signifie que votre objet modèle attend un document JSON qui ressemble à ceci:

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

Mais dans votre document JSON, vous retournez un tableau d'objets ParametersType. Vous devez donc modifier votre modèle pour qu'il soit une liste d'objets ParametersType:

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

Le fait que vous renvoyez un tableau d'objets ParametersType explique pourquoi l'analyseur se plaint de ne pas pouvoir désérialiser un objet hors de START_ARRAY. Il cherchait un nœud avec un seul objet, mais a trouvé un tableau d'objets dans votre JSON.

19
gregwhitaker