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é:
@JsonProperty("SerialNo")
à l'instanciation de la propriété - même erreur@JsonProperty("SerialNo")
aux getters correspondants - même erreur@JsonProperty("SerialNo")
aux setters correspondants - même erreur@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?
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
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.
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
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
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
Ajouter l'import
import org.codehaus.jackson.map.DeserializationConfig;
Configurez ObjectMapper ObjectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
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;