AndroidKotlin-使用gson或其他工具在SharedPreferences中保存和检索JSONArray

yhuiod9q  于 2023-08-05  发布在  Android
关注(0)|答案(1)|浏览(124)

我已经在这上面浪费了很多时间。
我需要在SharedPreferences中存储和检索val response = JSONArray(it)
到目前为止,我只在GSON上尝试过

尝试1:

prefs.edit().putString("amz", response.toString()).apply()
val jsonPref = prefs.getString("amz", "")
val jArr: JsonArray = Gson().fromJson(jsonPref, JsonArray::class.java)
val title = jArr.getJSONObject(0).getString("title")

字符串
我在getJSONObject上得到unresolved reference,即使它可以工作:

val title = response.getJSONObject(0).getString("title")


responsejArr看起来不同。
回复:

[{"asin":"B0015Z9KS2","title":"Eierbecher mit Stil ^^ 🐔🥚🐔","picurl":"\/amzimg\/B0015Z9KS2.jpg"},{"asin":"B002SQG4TU","title":"S**t happens... 😋😍😁","picurl":"\/amzimg\/B002SQG4TU.jpg"}]


jArr:

[{"asin":"B0015Z9KS2","title":"Eierbecher mit Stil ^^ 🐔🥚🐔","picurl":"/amzimg/B0015Z9KS2.jpg"},{"asin":"B002SQG4TU","title":"S**t happens... 😋😍😁","picurl":"/amzimg/B002SQG4TU.jpg"}]


所以response被转义,jArr没有

尝试2:

prefs.edit().putString("amz", response.toString()).apply()
val jsonPref = prefs.getString("amz", "")
val jArr: JsonArray = JsonParser.parseString(jsonPref).asJsonArray
val title = jArr.getJSONObject(0).getString("title")


与尝试1中的问题完全相同。

尝试3:

prefs.edit().putString("amz", Gson().toJson(response)).apply()
val jsonPref = prefs.getString("amz", "")
val jArr: JsonArray = Gson().fromJson(jsonPref, JsonArray::class.java)


我来了

Expected a com.google.gson.JsonArray but was com.google.gson.JsonObject


上的

val jArr: JsonArray = Gson().fromJson(jsonPref, JsonArray::class.java)

尝试4:

prefs.edit().putString("amz", Gson().toJson(response)).apply()
val jsonPref = prefs.getString("amz", "")
val jArr: JSONArray = Gson().fromJson(jsonPref, JSONArray::class.java)


注意JsonArrayJSONArray之间的区别
在打印jArr时,我得到了这个愚蠢的废话:

["{nameValuePairs={asin=B0015Z9KS2, title=Eierbecher mit Stil ^^ 🐔🥚🐔, picurl=\/amzimg\/B0015Z9KS2.jpg}}","{nameValuePairs={asin=B002SQG4TU, title=S**t happens... 😋😍😁, picurl=\/amzimg\/B002SQG4TU.jpg}}"]


救命啊!

zdwk9cvp

zdwk9cvp1#

这里的主要问题似乎是您混合了多个JSON库。JSONArray可能来自JSON-java,而您的其他代码使用的是Gson。这也解释了您遇到的问题:
我在getJSONObject上得到了未解析的引用,即使它可以工作:

val title = response.getJSONObject(0).getString("title")

字符串
jArr.getJSONObject(0)不能工作,因为Gson有一个completely different API(您的IDE应该建议您使用现有的函数)。Gson的等价物可能是jArr.get(0).getAsJsonObject()
responsejArr看起来不同
这应该不重要。唯一的区别似乎是/被转义了,这是可选的(另请参阅JSON规范)。它不会改变所表示数据的含义,并且对于任何兼容的JSON库来说,/\/是否出现在JSON数据中并不重要。

prefs.edit().putString("amz", Gson().toJson(response)).apply()
...


我来了

Expected a com.google.gson.JsonArray but was com.google.gson.JsonObject


这是最有可能的“预期”。response的类型为JSONArray,Gson不知道,因为它来自不同的JSON库。因此,它将其视为没有内置适配器的常规类,并使用反射对其进行序列化。这将导致JSON对象包含JSONArray类的所有内部字段,而不是将其序列化为JSON数组。因此,当您尝试再次反序列化它时,它会失败,因为它被序列化为JSON对象而不是JSON数组。
旁注:一般来说,对于第三方类,您应该避免依赖Gson的基于反射的序列化,因为这样您就依赖于它们的实现细节,而这些细节随时都可能发生变化。
注意JsonArrayJSONArray之间的区别
在打印jArr时,我得到了这个愚蠢的废话:
与前一个类似,只不过您现在也要反序列化它。
总结一下:不要混合使用不同的JSON库。要么坚持使用JSON-java,要么坚持使用Gson,但不能同时使用两者。如果真的有必要,你可以在代码的不同部分使用它们,只要你只在它们之间交换JSON数据,但是要小心交换特定于库的对象。

相关问题