杰克逊JSON解析器使用ProGuard优化后返回Android上的所有对象成员空 [英] Jackson Json parser returns nulls on all object members on Android after optimizing with Proguard

查看:227
本文介绍了杰克逊JSON解析器使用ProGuard优化后返回Android上的所有对象成员空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Android应用程序,它使用杰克逊分析器JSON解析。之后,我已经上了班跑的Proguard我开始在每个和反序列化类的每个成员值。
举例来说,如果我有一个目标:

 公共类服务{
    私人字符串名称;
    私人字符串版本;
    ...干将,setter和东西
}

和我收到一个JSON与这些对象的列表:

  [{名:服务1,版本:1.1},{名:服务2,版本:1.0}]

然后我做的:

  objectMapper.readValue(jsonString,新TypeReference<名单,LT;服务与GT;>(){})

我得到的是,所有成员都为空。

2 服务对象名单

任何想法?

感谢

更新

我已经错过了ProGuard的警告:

 组织codehaus.jackson.map.deser.EnumSetDeserializer:。无法找到参考的方法'EnumDeserializer(ORG codehaus.jackson.map.deser.EnumResolver )'类组织。codehaus.jackson.map.deser.EnumDeserializer
。组织codehaus.jackson.map.deser.impl.StringCollectionDeserializer:找不到引用的方法'组织codehaus.jackson.map.JsonMappingException instantiationException(java.lang.Class中,java.lang.Exception的) 在课堂上组织。codehaus.jackson.map.DeserializationContext

固定那些有:

  -dontskipnonpubliclibraryclassmembers

和该做的。

亚历

P.S。

这里的proguard.conf,所有的库由Maven插件添加

  -keep公共类*扩展android.app.Activity
-keep公共类*扩展android.app.Application
-keep公共类*扩展android.app.Service
-keep公共类*扩展android.content.BroadcastReceiver
-keep公共类*扩展android.content.ContentProvider
-keep公共类*扩展android.app.backup.BackupAgentHelper
-keep公共类*扩展Android系统。preference。preference-dontoptimize
-dontnote
-dontskipnonpubliclibraryclasses
-printmapping map.txt
-printseeds seed.txt
-ignorewarnings-keepclassmembers类* {@ com.google.api.client.util.Key<领域取代;}-keepattributes签名,RuntimeVisibleAnnotations,AnnotationDefault
-keepattributes *注释*-keepclasseswithmembers公共类* {公共静态无效的主要(java.lang.String中[]);}-keepclassmembers公共类com.anydo.client.model ** {*; }
-keepclassmembers公共类com.anydo.common.dto ** {*;}
。-keep类com.j256 ** {*;}-dontskipnonpubliclibraryclassmembers
-keepclasseswithmembernames类* {
    天然的所述;方法&gt ;;
}-keepclasseswithmembernames类* {
    公众和LT; INIT>(android.content.Context,android.util.AttributeSet);
}-keepclasseswithmembernames类* {
    公众和LT; INIT>(android.content.Context,android.util.AttributeSet,INT);
}-keepclassmembers枚举* {
    公共静态** []值();
    公共静态**的valueOf(java.lang.String中);
}-keep类*实现android.os.Parcelable {
  公共静态最终android.os.Parcelable $造物主*;
}-keepclassmembers类**。R $ * {
    公共静态<领域取代;
}#ACRA
-keep类org.acra.ACRA {
        *;
}#保持这个周围的ACRA需要一些枚举
-keep类org.acra.ReportingInteractionMode {*; }
#保持这个否则被删除的ProGuard
-keep公共类org.acra.ErrorReporter
{
公共无效addCustomData(java.lang.String中,java.lang.String中);
}#保持这个否则被删除的ProGuard
-keep公共类org.acra.ErrorReporter
{
公共org.acra.ErrorReporter $ ReportsSenderWorker handleSilentException(java.lang.Throwable的);
}


解决方案

它看起来就像你在一个项目中结合不同版本的杰克逊映射器罐子。

杰克逊映射器-ASL-1.7.9.jar包含


  • 组织。codehaus.jackson.map.deser.EnumSetDeserializer

  • 组织。codehaus.jackson.map.deser.EnumDeserializer与构造
    EnumDeserializer(ORG。codehaus.jackson.map.deser.EnumResolver)

杰克逊映射器-ASL-1.9.2.jar包含


  • 组织。codehaus.jackson.map.deser.std.EnumSetDeserializer

  • 组织。codehaus.jackson.map.deser.EnumDeserializer与构造
    EnumDeserializer(ORG。codehaus.jackson.map.util.EnumResolver)

通知书EnumSetDeserializer不同的包装物及EnumDeserializer不同的构造函数。 ProGuard的无法解析1.7.9 EnumSetDeserializer到1.9.2 EnumDeserializer的同一类路径上的构造参考,并正确地提醒一下。

I have an Android app which uses Jackson parser for JSON parsing. After I've ran Proguard on the classes I started to get null values on each and every member of the de-serialized classes. For example, if I have a object:

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

and I receive a JSON with list of those objects:

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

then I do:

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

what I get is a list with 2 Service objects where all members are null.

Any ideas?

Thanks

UPDATE

I've missed ProGuard warnings:

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

fixed those with:

-dontskipnonpubliclibraryclassmembers

and that did it.

Alex

P.S.

Here's the proguard.conf, all the libraries are added by Maven plugin

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

解决方案

It looks like you're combining different versions of the jackson-mapper jar in a single project.

jackson-mapper-asl-1.7.9.jar contains

  • org.codehaus.jackson.map.deser.EnumSetDeserializer
  • org.codehaus.jackson.map.deser.EnumDeserializer with constructor EnumDeserializer(org.codehaus.jackson.map.deser.EnumResolver)

jackson-mapper-asl-1.9.2.jar contains

  • org.codehaus.jackson.map.deser.std.EnumSetDeserializer
  • org.codehaus.jackson.map.deser.EnumDeserializer with constructor EnumDeserializer(org.codehaus.jackson.map.util.EnumResolver)

Notice the different packages for EnumSetDeserializer and the different constructors for EnumDeserializer. ProGuard can't resolve the reference of the 1.7.9 EnumSetDeserializer to the constructor of the 1.9.2 EnumDeserializer on the same class path, and it rightly warns about it.

这篇关于杰克逊JSON解析器使用ProGuard优化后返回Android上的所有对象成员空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆