我正在尝试使用Gson将Kotlin对象转换为JsonString。我正在使用这些函数将对象转换为字符串{'a': '', 'b': ''}如果minifyEnabled为false,则它工作正常如果minifyEnabled为true,则会转换为类似{'a': '', 'b': ''}的内容键替换为a、B、c、d......等尝试添加Gson proguard。但没有找到任何运气有人能帮我解决这个问题吗
{'a': '', 'b': ''}
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避免使用反射,而是使用您指定的名称:
-dontobfuscate
SerializedName
data class Thingy( @SerializedName("firstBitOfData") val firstBitOfData: String, @SerializedName("secondBitOfData") val secondBitOfData: String )
(with这与ProGuard/R8在更改属性名称方面的操作无关)
1条答案
按热度按时间h7wcgrx31#
问题不是 Gson 受到ProGuard/R8的影响。问题是 * 您的代码 * 受到ProGuard/R8的影响。
假设这是您尝试与JSON进行转换的Kotlin类:
默认情况下,Gson使用Java反射来决定如何将对象转换为JSON。
这将给予如下结果:
Gson问Java/Kotlin“嘿,这些属性的名称是什么?",它在生成JSON时默认使用这些属性。但是,ProGuard/R8更改了这些属性的名称。这就是为什么您在问题中使用JSON。
您有三个主要选项可以影响此行为。
首先,您可以通过更新ProGuard/R8规则文件,为该类(以及任何其他要转换为JSON/从JSON转换而来的类)关闭ProGuard/R8。
第二,你可以把ProGuard/R8重命名完全为应用程序,所以它缩小,但不改变的东西的名称,通过
-dontobfuscate
.第三,可以使用
SerializedName
注解告诉Gson避免使用反射,而是使用您指定的名称:(with这与ProGuard/R8在更改属性名称方面的操作无关)