webentwicklung-frage-antwort-db.com.de

Jackson Json Deserialisierung: Nicht erkanntes Feld "...", nicht als ignorierbar gekennzeichnet

Ich erhalte die folgende Fehlermeldung und keine Lösung, die ich für mich getan habe:

Nicht erkanntes Feld "GaugeDeviceId" (Class GaugeDevice), nicht als ignorierbar gekennzeichnet

Das Problem scheint, dass der Dienst die Eigenschaftsnamen mit einem führenden oberen Buchstaben zurückgibt, während die Klasseneigenschaften mit einem unteren Buchstaben beginnen.

Ich habe es versucht:

  1. propertyNames in ersten oberen Buchstaben ändern - gleicher Fehler
  2. hinzufügen von @JsonProperty("SerialNo") zur Eigenschaftsinstanziierung - gleicher Fehler
  3. hinzufügen von @JsonProperty("SerialNo") zu den entsprechenden Getigern - gleicher Fehler
  4. hinzufügen von @JsonProperty("SerialNo") zu den entsprechenden Setters - gleicher Fehler
  5. hinzufügen von @JsonProperty("SerialNo") zu allen (nur zum Spaß) - derselbe Fehler

(Hinweis: @JsonProperty("SerialNo") ist nur ein Beispiel)

Das Merkwürdige ist, dass die Anmerkung: @JsonIgnoreProperties(ignoreUnknown = true) sollte genau diesen Fehler unterdrücken, aber es wird immer noch ausgelöst.

hier die Klasse: (Anmerkung: nicht vollständig)

@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;
    }

Wo ist der Weg hier raus? Bitte helfen.

edit:

Hier ist die Client-Klasse: (nur ein einfacher Testclient)

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);
    }
}

Ich hoffe der Fehler hat hier seine Wurzel?

19
chile

Eine andere Sache, die Sie ausprobieren sollten, ist PropertyNamingStrategy, die es Jackson ermöglichen würde, "Pascal-Benennung" zu verwenden und JSON-Eigenschaften mit POJO-Eigenschaften abzugleichen. Sehen Sie sich f.ex hier an: http://www.javacodegeeks.com/2014/04/wie-zu-gebraucht-anwendungsimmanagementstrategie-in-jackson.html

8
StaxMan

Ich hatte das gleiche Problem und habe es behoben, indem ich den Anmerkungsimport geändert habe:

com.fasterxml.jackson.annotation.JsonIgnoreProperties

zu 

org.codehaus.jackson.annotate.JsonIgnoreProperties

Müssen keine NamingStrategy oder ObjectMapper definieren.

17
Christos

Ich hatte das gleiche Problem und löste es durch Ändern des Anmerkungsimports von

com.fasterxml.jackson.annotation.JsonProperty

zu 

org.codehaus.jackson.annotate.JsonProperty
10
Bilal

Angesichts des folgenden ist Ihr Fehler:

Nicht erkanntes Feld "GaugeDeviceId" (Class GaugeDevice), nicht als ignorierbar gekennzeichnet

Ich bin mir ziemlich sicher, dass Sie für die GaugeDeviceId-Eigenschaft dasselbe tun müssen wie für die SerialNo-Eigenschaft.

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

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

Hier habe ich eine schnelle Testklasse, die keine Fehler auslöst.

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();
        }
    }
}

Und es gibt:

123
456

EDIT: Versionsinformation

Nicht, dass es wichtig ist, da ich glaube, dass das Obige alle ein paar Standard-Sachen von Jackson verwendet, ich verwende Version 1.9.13 von core-asl und mapper-asl Bibliotheken


EDIT: Client bereitgestellt

Ich frage mich, ob dies mit diesem Problem zusammenhängt? Ich glaube, die Auflösung ist die Konfiguration der Abhängigkeiten, die Sie verwenden.

Ich bin mir nicht sicher, aber ich fühle mich so, als wäre ich mit der folgenden Abhängigkeitseinstellung nahe.

    <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>

Diese Links haben die Konfigurationsinformationen bereitgestellt: Link 1 , Link 2

8
Dan Temple

Sie können die unbekannten Eigenschaften bei der Deserialisierung ignorieren, indem Sie eine Annotation auf Klassenebene verwenden. 

Zum Beispiel :

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

Das obige Snippet ignoriert unbekannte Eigenschaften. (Import von Anmerkungen: org.codehaus.jackson.annotate.JsonIgnoreProperties)

Die Lösung, die für mich funktioniert, ist folgende

  1. Fügen Sie den Import hinzu

    import org.codehaus.jackson.map.DeserializationConfig;

  2. Konfigurieren Sie den ObjectMapper ObjectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

  3. Die komplette Lösung

    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