Gson:toJson/toJsonTree已启用最小化问题

wwwo4jvm  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(178)

我正在尝试使用Gson将Kotlin对象转换为JsonString。
我正在使用这些函数将对象转换为字符串
{'a': '', 'b': ''}
如果minifyEnabled为false,则它工作正常
如果minifyEnabled为true,则会转换为类似{'a': '', 'b': ''}的内容
键替换为a、B、c、d......等
尝试添加Gson proguard。但没有找到任何运气
有人能帮我解决这个问题吗

h7wcgrx3

h7wcgrx31#

问题不是 Gson 受到ProGuard/R8的影响。问题是 * 您的代码 * 受到ProGuard/R8的影响。
假设这是您尝试与JSON进行转换的Kotlin类:

data class Thingy(
  val firstBitOfData: String,
  val secondBitOfData: String
)

默认情况下,Gson使用Java反射来决定如何将对象转换为JSON。

val myThingy = Thingy("foo", "bar")
val jsonOfThingy = Gson().toJson(myThingy)

println(jsonOfThingy)

这将给予如下结果:

{"firstBitOfData": "foo", "secondBitOfData: "bar"}

Gson问Java/Kotlin“嘿,这些属性的名称是什么?",它在生成JSON时默认使用这些属性。但是,ProGuard/R8更改了这些属性的名称。这就是为什么您在问题中使用JSON。
您有三个主要选项可以影响此行为。
首先,您可以通过更新ProGuard/R8规则文件,为该类(以及任何其他要转换为JSON/从JSON转换而来的类)关闭ProGuard/R8。
第二,你可以把ProGuard/R8重命名完全为应用程序,所以它缩小,但不改变的东西的名称,通过-dontobfuscate.
第三,可以使用SerializedName注解告诉Gson避免使用反射,而是使用您指定的名称:

data class Thingy(
  @SerializedName("firstBitOfData") val firstBitOfData: String,
  @SerializedName("secondBitOfData") val secondBitOfData: String
)

(with这与ProGuard/R8在更改属性名称方面的操作无关)

相关问题