仅在“RELEASE”构建模式中命名为异常的多个 JSON 字段

Posted

技术标签:

【中文标题】仅在“RELEASE”构建模式中命名为异常的多个 JSON 字段【英文标题】:multiple JSON fields named exception in “RELEASE” build mode only 【发布时间】:2017-07-20 10:35:26 【问题描述】:

这很奇怪,但是序列化在 DEBUG 构建模式以及除一个之外的所有 API 响应中都非常好。但是在发布模式下,它会抛出非法参数异常。

以下是此异常的完整日志:

FATAL EXCEPTION: main Process: com.example.sampleapp, PID: 30480 java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.sampleapp/com.example.sampleapp.activity.ManageStoreActivity: java.lang.IllegalArgumentException: Unable to create converter for class com.example.sampleapp.model.seller.SellerStoreFormData
  for method ApiInterface.getSellerInfoData
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
  at android.app.ActivityThread.-wrap11(ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:148)
  at android.app.ActivityThread.main(ActivityThread.java:5417)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)


 Caused by: java.lang.IllegalArgumentException: Unable to create converter for class com.example.sampleapp.model.seller.SellerStoreFormData
  for method ApiInterface.getSellerInfoData
  at retrofit2.ServiceMethod$Builder.methodError(Unknown Source)
  at retrofit2.ServiceMethod$Builder.createResponseConverter(Unknown Source)
  at retrofit2.ServiceMethod$Builder.build(Unknown Source)
  at retrofit2.Retrofit.loadServiceMethod(Unknown Source)
  at retrofit2.Retrofit$1.invoke(Unknown Source)
  at java.lang.reflect.Proxy.invoke(Proxy.java:393)
  at $Proxy0.getSellerInfoData(Unknown Source)
  at com.example.sampleapp.connection.a.i(Unknown Source)
  at com.example.sampleapp.activity.ManageStoreActivity.onStart(Unknown Source)
  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237)
  at android.app.Activity.performStart(Activity.java:6253)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
    ... 9 more


 Caused by: java.lang.IllegalArgumentException: class com.example.sampleapp.model.seller.SellerStoreFormData declares multiple JSON fields named f
  at com.google.a.b.a.i.a(Unknown Source)
  at com.google.a.b.a.i.a(Unknown Source)
  at com.google.a.e.a(Unknown Source)
  at retrofit2.converter.gson.GsonConverterFactory.responseBodyConverter(Unknown Source)
  at retrofit2.Retrofit.nextResponseBodyConverter(Unknown Source)
  at retrofit2.Retrofit.responseBodyConverter(Unknown Source)
    ... 20 more

到目前为止我尝试了什么?

    我已尝试并在同一父级中查找多个 JSON 字段 上课,但没有找到。 检查每个字段的@SerializedName 是否不同。

我还在发布模式下启用了 proguard。

之前它工作正常(没有启用 proguard),我没有收到任何编译时错误。

【问题讨论】:

模型SellerStoreFormData中有两个同名的JSON字段 @aksacha 我已经检查了很多次,但没有找到。 甚至不在父模型中 显示您的SellerStoreFormData 型号代码.. 【参考方案1】:

如果调试模式正常工作并且发布是问题,那么很可能这是一个 proguard 问题。 尝试从混淆中排除 SellerStoreFormData。

另外,检查您是否有proguard Gson configuration,如果没有,请添加它。

【讨论】:

感谢我已经维护了一个正确的 proguard 文件。但更新它有效。就像缺少分号一样愚蠢。由于 proguard 配置,该消息可能具有误导性。

以上是关于仅在“RELEASE”构建模式中命名为异常的多个 JSON 字段的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 如何仅在某些情况下强制执行对象属性(构建器模式,依赖注入)

仅在 Release 中尝试捕获的更好方法?

Swift 框架不适用于名为“Debug”或“Release”以外的构建配置:没有这样的模块

仅在 IIS 部署后的 Asp.net Web api 异常:名为“HelpPage_Default”的路由已在路由集合中

OpenCV mat::at 抛出异常

仅在发布模式下使用 glGenBuffer 的未处理异常 - QT