gpt4 book ai didi

java - 使用 Proguard 优化后,Jackson Json 解析器在 Android 上的所有对象成员上返回空值

转载 作者:太空狗 更新时间:2023-10-29 14:29:52 27 4
gpt4 key购买 nike

我有一个 Android 应用程序,它使用 Jackson 解析器进行 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

就是这样。

亚历克斯

附言

这里是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);
}

最佳答案

看起来您正在将不同版本的 jackson-mapper jar 组合到一个项目中。

jackson-mapper-asl-1.7.9.jar 包含

  • org.codehaus.jackson.map.deser.EnumSetDeserializer
  • 带有构造函数的 org.codehaus.jackson.map.deser.EnumDeserializerEnumDeserializer(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.EnumDeserializerEnumDeserializer(org.codehaus.jackson.map.util.EnumResolver)

请注意 EnumSetDeserializer 的不同包和 EnumDeserializer 的不同构造函数。 ProGuard 无法解析 1.7.9 EnumSetDeserializer 对同一类路径上 1.9.2 EnumDeserializer 的构造函数的引用,它会正确地发出警告。

关于java - 使用 Proguard 优化后,Jackson Json 解析器在 Android 上的所有对象成员上返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8027302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com