web-dev-qa-db-fra.com

Désérialisation de Jackson Json: champ non reconnu "...", non marqué comme ignorable

Je reçois l'erreur suivante et aucune résolution que j'ai trouvée n'a fait l'affaire pour moi:

Champ non reconnu "GaugeDeviceId" (Classe GaugeDevice), non marqué comme ignorable

Le problème semble que le service retourne les noms de propriété avec une lettre supérieure, tandis que les propriétés de la classe commencent par une lettre inférieure.

J'ai essayé:

  1. changer les noms de propriétés en première lettre supérieure - même erreur
  2. ajout de @JsonProperty("SerialNo") à l'instanciation de la propriété - même erreur
  3. ajout de @JsonProperty("SerialNo") aux getters correspondants - même erreur
  4. ajout de @JsonProperty("SerialNo") aux setters correspondants - même erreur
  5. en ajoutant @JsonProperty("SerialNo") à tous (juste pour le fun) - même erreur

(note: @JsonProperty("SerialNo") est juste un exemple)

La chose étrange est que cette annotation: @JsonIgnoreProperties(ignoreUnknown = true) devrait supprimer exactement cette erreur, mais elle continue de se déclencher ...

ici la classe: (note: pas complet)

@JsonIgnoreProperties(ignoreUnknown = true)
public class GaugeDevice 
{
    private int gaugeDeviceId;
    private Date utcInstallation;
    private String manufacturer;
    private float valueOffset;
    private String serialNo;
    private String comment;
    private int digitCount;
    private int decimalPlaces;

    @JsonProperty("SerialNo")
    public String getSerialNo() {
        return serialNo;
    }

    public void setSerialNo(String serialNo) {
        this.serialNo = serialNo;
    }

    @JsonProperty("Comment")
    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

Où est le moyen de sortir ici? S'il vous plaît aider.

modifier:

Voici la classe de clients: (juste un client test simple)

import ccc.Android.meterdata.*;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import org.glassfish.jersey.jackson.JacksonFeature;

public class RestClient
{
    private String connectionUrl;
    private javax.ws.rs.client.Client client;

    public RestClient(String baseUrl) {
         client = ClientBuilder.newClient();;
         connectionUrl = baseUrl;
         client.register(JacksonFeature.class); 
    }

    public GaugeDevice GetGaugeDevice(int id){

        String uri = connectionUrl + "/GetGaugeDevice/" + id;
        Invocation.Builder bldr = client.target(uri).request("application/json");
        return bldr.get(GaugeDevice.class);
    }
}

J'espère que l'erreur a sa racine ici?

19
chile

Une autre chose à vérifier est PropertyNamingStrategy, ce qui permettrait à Jackson d'utiliser le "nommage Pascal" et de faire correspondre les propriétés JSON aux propriétés POJO. Voir f.ex ici: http://www.javacodegeeks.com/2013/04/how-to-use-propertynamingstrategy-in-jackson.html

8
StaxMan

J'ai eu le même problème et je l'ai résolu en modifiant l'importation des annotations depuis:

com.fasterxml.jackson.annotation.JsonIgnoreProperties

à 

org.codehaus.jackson.annotate.JsonIgnoreProperties

Vous n'avez pas eu besoin de définir NamingStrategy ou ObjectMapper.

17
Christos

J'ai eu le même problème et l'ai résolu en modifiant l'importation d'annotation de

com.fasterxml.jackson.annotation.JsonProperty

à 

org.codehaus.jackson.annotate.JsonProperty
10
Bilal

Compte tenu de ce qui suit est votre erreur:

Champ non reconnu "GaugeDeviceId" (Classe GaugeDevice), non marqué comme ignorable

Je suis presque certain que vous devez faire la même chose pour la propriété GaugeDeviceId comme pour la propriété SerialNo.

@JsonProperty("SerialNo")
public String getSerialNo() {
    return this.serialNo;
}

@JsonProperty("GaugeDeviceId")
public int getGaugeDeviceId() {
    return this.gaugeDeviceId;
}

Ici, j'ai une classe de test rapide qui ne génère pas d'erreurs.

import org.codehaus.jackson.map.ObjectMapper;

public class JsonDeserialization {
    public static void main(final String[] args) {
        final String json = "{ \"SerialNo\":\"123\", \"GaugeDeviceId\":\"456\"}";

        final ObjectMapper mapper = new ObjectMapper();

        try {
            final GaugeDevice readValue = mapper.readValue(json, GaugeDevice.class);
            System.out.println(readValue.getSerialNo());
            System.out.println(readValue.getGaugeDeviceId());
        } catch (final Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Et cela donne:

123
456

EDIT: Informations sur la version

Ce n’est pas important, car je crois que tout ce qui précède utilise des éléments assez standard de Jackson, j’utilise la version 1.9.13 de core-asl et mapper-asl les bibliothèques


EDIT: client fourni

Je me demande si cela est lié à ce problème ? Je crois que la résolution est la configuration des dépendances que vous utilisez.

Je ne suis pas sûr, mais j'ai l'impression d'être proche de la configuration de dépendance suivante (notez que j'utilise maven)

    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-processing</artifactId>
        <version>2.0</version>
    </dependency>

Ces liens ont fourni les informations de configuration: lien 1 , lien 2

8
Dan Temple

Vous pouvez ignorer les propriétés inconnues lors de la désérialisation en utilisant une annotation au niveau de la classe. 

Par exemple :

@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
 ...
}

L'extrait ci-dessus ignorera toutes les propriétés inconnues. (Importation d'annotation: org.codehaus.jackson.annotate.JsonIgnoreProperties)

La solution qui fonctionne pour moi est la suivante

  1. Ajouter l'import

    import org.codehaus.jackson.map.DeserializationConfig;

  2. Configurez ObjectMapper ObjectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

  3. La solution complète

    ObjectMapper objectMapper = new ObjectMapper ();
    objectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    String jsonInString = objectMapper.writeValueAsString (eje); Eje newElement = objectMapper.readValue (jsonInString, Eje.class); this.eje = newElement;

0
Jorge Santos Neill