Sonntag, Juli 5, 2020

Jackson-ObjectMapper Widersprüchliche setter definitions (Android.Grafik.Bitmap -)

Habe ich diese Methode :

 public static Response deserializeResponse(String jsonResponse) throws JsonParseException, JsonMappingException, IOException {

    ObjectMapper mapper = new ObjectMapper();

    try{
        return mapper.readValue(jsonResponse, Response.class);
    }catch(JsonParseException e){
        e.printStackTrace();
    }catch(JsonMappingException e){
        e.printStackTrace();
    }catch(IOException e){
        e.printStackTrace();
    }
    return null;
}

Hier wird die Klasse Antwort :

public static class Response {

    public String RequestType;

    public Data data;

    public void SetRequestType(String requestType) { this.RequestType = requestType; }

    @JsonIgnore
    @JsonProperty("data")
    public void SetData(Data data) { this.data = data; }

    public Response(){
        data = new Data();
    }

    public static class Data {

        public String Status;
        public String ErrorCode;
        public int versionCode;
        public String Expiry;
        public String ProductSKU;
        public String Email;
        public String Birthday;
        public String PictureUrl;
        public String Pin;
        public List<PhoneNumber> Numbers = new ArrayList<PhoneNumber>();
        public int IdTransaction;
        public int SubProductId;

        public List<Performer> Performers = new ArrayList<Performer>();
        public Client Client;

        public Data() {}
    }
}

Hier der Aufruf aus einer anderen Klasse :

Response rep = JsonOperation.deserializeResponse(jsonString);

Ich diesen code ausführen auf einem Gerät nutzt android 2.3.6 und alles funktioniert perfekt.
Wenn ich diesen code auf meinem Galaxy Note 3 oder S4, ich habe severals Fehler. Hier ist der log :

W/System.err com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter     definitions for property "imagePath": android.graphics.Bitmap#setImagePath(1 params) vs android.graphics.Bitmap#setImagePath(1 params)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:325)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:633)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:427)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:295)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:325)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:147)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createContextual(CollectionDeserializer.java:23)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:329)
03-21 15:51:54.373  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:633)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:427)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:295)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:325)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:633)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:427)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:295)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:143)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:342)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:2895)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2789)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1943)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.francovoyance.JsonOperation.deserializeResponse(JsonOperation.java:321)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.francovoyance.HttpOperation$HttpPostRequest.doInBackground(HttpOperation.java:125)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.francovoyance.HttpOperation$HttpPostRequest.doInBackground(HttpOperation.java:69)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at android.os.AsyncTask$2.call(AsyncTask.java:287)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at java.util.concurrent.FutureTask.run(FutureTask.java:234)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at java.lang.Thread.run(Thread.java:841)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err Caused by: java.lang.IllegalArgumentException: Conflicting setter definitions for property "imagePath": android.graphics.Bitmap#setImagePath(1 params) vs android.graphics.Bitmap#setImagePath(1 params)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:196)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.filterBeanProps(BeanDeserializerFactory.java:614)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:522)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:267)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:171)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:388)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
03-21 15:51:54.383  15204-15218/com.francovoyance W/System.err ... 36 more

Hier ist die Json-input vom server :

private string CheckVersion(JObject jsonObject)
{
    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    using (JsonWriter writer = new JsonTextWriter(sw))
    {
        writer.Formatting = Formatting.Indented;
        writer.WriteStartObject();

        writer.WritePropertyName("RequestType");
        writer.WriteValue("CheckVersion");

        writer.WritePropertyName("data");
        writer.WriteStartObject();

        writer.WritePropertyName("Status");

        string inVersion = (string)jsonObject["data"]["versionCode"];
        string actualVersion = WebTV.Common.AppSettings.GetString("APP_VERSION", "1");
        actualVersion = Convert.ToString((int)Convert.ToDouble(actualVersion));

        if (inVersion.Equals(actualVersion))
        {
            writer.WriteValue("Ok");
        }
        else
        {
            writer.WriteValue("Error");

            writer.WritePropertyName("versionCode");
            writer.WriteRawValue(actualVersion);
        }

        writer.WriteEndObject();

    }
    return sb.ToString();
}

Habe ich gesucht und versucht, Antworten zu finden für dieses problem, aber ich habe nichts gefunden über die setter in android.Grafik.Bitmap… ich habe @JsonIgnore ohne Ergebnisse.
Ich brauche Hilfe zum auflösen der Ausnahme, wenn ich versuche, die mapper.
Jede Hilfe würde geschätzt werden.

  • Zeigen Sie Ihre JSON-Eingabe, insbesondere die imagePath key-das ist, wo das problem liegt.
  • Ich habe ähnliche Probleme. Funktioniert auf Galaxy Nexus und Nexus 5, aber nicht auf meinem S4 (Play edition; 4.2.2).

1 Kommentar

  1. 9

    Ich nur dieses Problem gelöst (für mich), obwohl es fühlt sich wie mehr ein workaround für diese Samsung-Geräte. Ich merke, Sie haben erwähnt, Sie versucht, die @JsonIgnore Anmerkung, aber es geschafft, zu lösen mein Problem.

    In mein Modell, ich war nur das mapping von JSON auf eine kleine Teilmenge der meine Basis-Modell. In diesem Basis-Modell-allerdings hatte ich eine Liste von einem anderen Objekt-Modell, die eine Bitmap. Durch das hinzufügen von @JsonIgnore, um die Liste der Modelle, das Problem behoben wurde (obwohl ich nicht die Zuordnung zu Ihnen und Sie sollten ignoriert worden).

    Hatte ich mich schon mit einem ObjectMapper-Funktion zu ignorieren, ungebrauchte Werte, aber es hat nicht funktioniert auf der Samsung-Geräte.

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    Im Beispiel unten mein Profil-Objekt enthält ein Bitmap, und ich bin nur die Zuordnung der Namen und Alter, mit der JSON.

    Beispiel:

    public class A {
    
    private String name;
    
    private int age;
    @JsonIgnore
    private List<Profile> profiles;
    }

    Wenn ich hatte, um eine wilde Vermutung, ich würde sagen, Ihr Darsteller-Objekt eine Bitmap enthält, und wenn Sie keine Zuordnung, dann ich wouldd versuchen, und ignorieren Sie die Liste.

    • Diese Antwort war sehr hilfreich, ich hatte das gleiche problem mit S3, S4, S4 mini und S5. Wenn Sie eine Set-und eine get-Methode für die Klasse mit der Bitmap, dann müssen Sie das @ – JsonIgnore Kommentar zu diese als gut.

Kostenlose Online-Tests