Анализатор Jackson Json возвращает нулевые значения для всех элементов объекта на Android после оптимизации с помощью Proguard - PullRequest
3 голосов
/ 06 ноября 2011

У меня есть приложение для Android, которое использует анализатор Джексона для анализа JSON.После того, как я запустил Proguard в классах, я начал получать значения null для каждого члена десериализованных классов.Например, если у меня есть объект:

public class Service{
    private String name;
    private String version;
    ... getters, setters and stuff
}

и я получаю JSON со списком этих объектов:

[{"name":"service1","version":"1.1"},{"name":"service2","version":"1.0"}]

, тогда я делаю:

objectMapper.readValue(jsonString,new TypeReference<List<Service>>() {})

то, что я получаю, это список с 2 Service объектами, где все члены нулевые.

Любые идеи?

Спасибо

ОБНОВЛЕНИЕ

Я 'мы пропустили предупреждения ProGuard:

org.codehaus.jackson.map.deser.EnumSetDeserializer: can't find referenced method 'EnumDeserializer(org.codehaus.jackson.map.deser.EnumResolver)' in class     org.codehaus.jackson.map.deser.EnumDeserializer
org.codehaus.jackson.map.deser.impl.StringCollectionDeserializer: can't find referenced method 'org.codehaus.jackson.map.JsonMappingException instantiationException(java.lang.Class,java.lang.Exception)' in class org.codehaus.jackson.map.DeserializationContext

исправил те с:

-dontskipnonpubliclibraryclassmembers

и это сделал.

Алекс

PS

Вот proguard.conf, все библиотеки добавляются плагином Maven

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference

-dontoptimize
-dontnote
-dontskipnonpubliclibraryclasses
-printmapping map.txt
-printseeds seed.txt
-ignorewarnings

-keepclassmembers class * {  @com.google.api.client.util.Key <fields>;}

-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
-keepattributes *Annotation*

-keepclasseswithmembers public class * {    public static void main(java.lang.String[]);}

-keepclassmembers public class com.anydo.client.model** { * ; }
-keepclassmembers public class com.anydo.common.dto** { * ;}
-keep class com.j256.** {*;}

-dontskipnonpubliclibraryclassmembers


-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

#ACRA
-keep class org.acra.ACRA {
        *;
}

# keep this around for some enums that ACRA needs
-keep class org.acra.ReportingInteractionMode { *; }
# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter
{
public void addCustomData(java.lang.String,java.lang.String);
}

# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter
{
public org.acra.ErrorReporter$ReportsSenderWorker handleSilentException(java.lang.Throwable);
}

1 Ответ

1 голос
/ 09 ноября 2011

Похоже, вы объединяете разные версии банки Джексона-Маппера в один проект.

jackson-mapper-asl-1.7.9.jar содержит

  • org.codehaus.jackson.map.deser.EnumSetDeserializer
  • org.codehaus.jackson.map.deser.EnumDeserializer с конструктором EnumDeserializer (org.codehaus.jackson.map.deser.EnumResolver)

jackson-mapper-asl-1.9.2.jar содержит

  • org.codehaus.jackson.map.deser.std.EnumSetDeserializer
  • org.codehaus.jackson.map.deser.EnumDeserializer с конструктором EnumDeserializer (org.codehaus.jackson.map.util.EnumResolver)

Обратите внимание на различные пакеты для EnumSetDeserializer и различные конструкторы для EnumDeserializer. ProGuard не может разрешить ссылку 1.7.9 EnumSetDeserializer на конструктор 1.9.2 EnumDeserializer на том же пути к классам, и он справедливо предупреждает об этом.

...