我正在嘗試使用 Gson 將 kotlin 物件轉換為 JsonString。
我正在使用這些函式將物件轉換為字串
Gson().toJson(object) Gson().toJsonTree(object)
如果 minifyEnabled 為 false,則作業正常
如果 minifyEnabled 為真,它正在轉換為類似
{'a': '', 'b': ''}
鍵被替換為 a,b,c,d... 等
嘗試添加 Gson proguard。但找不到任何運氣
誰能幫我解決這個問題
uj5u.com熱心網友回復:
問題不在于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 轉換的任何其他類)的 ProGuard/R8。
其次,您可以將 ProGuard/R8 完全重命名為應用程式,因此它會縮小但不會更改事物的名稱,通過-dontobfuscate.
第三,您可以使用SerializedName注釋告訴 Gson 避免使用反射,而是使用您指定的名稱:
data class Thingy(
@SerializedName("firstBitOfData") val firstBitOfData: String,
@SerializedName("secondBitOfData") val secondBitOfData: String
)
(這樣,ProGuard/R8 在更改屬性名稱方面所做的并不重要)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504587.html
