2014-03-21 3 views
7

У меня есть этот метод:Джексон ObjectMapper Противоречивые определения инкубационные (Android.Graphics.Bitmap)

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

Вот класс Ответ:

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

Вот вызов из другого класса:

Response rep = JsonOperation.deserializeResponse(jsonString); 

Я запускаю этот код на устройстве, использующем Android 2.3.6, и все работает отлично. Когда я запускаю этот код в своей Галактической Ноте 3 или S4, у меня есть отдельные ошибки. Вот лог:

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 

Здесь вход Json с сервера:

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

Я искал и пытался найти ответы на эту проблему, но я не нашел ничего о сеттеров в android.graphics.Bitmap ... Я попытался использовать @JsonIgnore без каких-либо результатов. Мне нужна помощь, чтобы разрешить исключение, когда я пытаюсь использовать mapper. Любая помощь будет оценена по достоинству.

+0

Показать свой вход JSON, в частности ключ 'imagePath' - вот в чем проблема. – fge

+0

У меня похожие проблемы. Работает на Galaxy Nexus и Nexus 5, но не работает на моем S4 (Play edition, 4.2.2). – Sam

ответ

9

Я только что решил эту проблему (для меня), хотя это похоже на обходное решение для этих устройств Samsung. Я понимаю, вы упомянули, что вы попробовали аннотацию @JsonIgnore, но мне удалось решить мою проблему.

В моей модели я только сопоставлял JSON с небольшим подмножеством базовой модели. Однако в этой базовой модели у меня был список другой объектной модели, содержащей битмап. Добавив @JsonIgnore в список моделей, проблема была решена (хотя я не сопоставлял их, и их следовало игнорировать).

Я использовал функцию ObjectMapper, чтобы игнорировать неиспользуемые значения, но она не работала на устройствах Samsung.

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

В приведенном ниже примере, мой профиль объект содержит Bitmap, а я только отображение имени и возраста с JSON.

Пример:

public class A { 

private String name; 

private int age; 
@JsonIgnore 
private List<Profile> profiles; 
} 

Если бы я должен был сделать дикую догадку, я бы сказал, что ваш исполнитель объект выше содержит Bitmap, и если вы не отображение на это, то я wouldd попытаться игнорировать список.

+1

Этот ответ был наиболее полезным, у меня была такая же проблема с S3, S4, S4 mini и S5. Если у вас есть сеттер и получатель для члена класса с Bitmap, вам также нужно добавить аннотацию @JsonIgnore к этим. – marp

+1

Да, парень! Это решение !!! –

Смежные вопросы