【发布时间】:2018-09-18 17:29:56
【问题描述】:
看到this thread 寻求可能的解决方案,但它打败了我。
我将客户数据对象作为 JSON 字符串存储在共享首选项 (Android) 中,并尝试检索字符串转换回客户对象并用于验证。从对象到 JSON 字符串的转换非常顺利,并存储在首选项中(作为键值(字符串)对)。
当我尝试使用 SharedPreferences.getString(key,"") 创建 JSONObject 或数组(它不是数组但无论如何都尝试过)时 - 我总是得到相同的错误“Value ... of type java.lang.String cannot be convert to JSONObject"。
我希望另一双眼睛能捕捉到我无法捕捉到的东西。
带有数据的错误消息(已屏蔽):
价值
{"address":{"city":"city","country":"country","customer_address_id":0,"customer_id":0,"house_number":"#123, Lane 1, Street 1","latitude":0.0,"longitude":0.0,"postcode":"12001","street":"Lane 2, Street 2"},"ageGroup":"25-45","dateOfBirth":"1537308474000","email":"abc@abc.com","firstName":"abcdefg","gender":"","id":"108","lastName":"xyz","locale":"en_us","middleName":"none","phone":"1234567890","uuid":"8c3ce2c5-600f-3c4e-bc07-727d61fae7ff"}
java.lang.String 类型的无法转换为 JSONObject。
我想做的就是(代码要点):
使用以下保存到共享首选项:
jsonAdapter = moshi.adapter(RegisterUser.class);
mRegisterUser = (RegisterUser) jsonAdapter.fromJson(regisCustUser.toString());
prefs = UserPrefs.getUserPrefs(getApplicationContext());
prefs.setPrefsItem(UserPrefs.getregUserKey(), jsonAdapter.toJson(mRegisterUser));`
setPrefsItem 的作用如下:
JsonAdapter jsonAdapter = moshi.adapter(javaObject.getClass());
String cartJson = jsonAdapter.toJson(javaObject);
// Log.e("CartJsonreflection", cartJson);
editor.putString(prefKey, cartJson);
editor.commit();
这里是检索发生的地方:
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
...
private static SharedPreferences settings;
...
public static Object someMethod(String prefKey, Object javaObject) {
String prefJson = settings.getString(prefKey, "");
JSONObject regisCustomer = new JSONObject(prefJson);
javaObject = (someObject) jsonAdapter.fromJson(regisCustomer.toString());
// casting is redundant but added for clarity
return javaObject;
}
prefJson 有上面的字符串。 我试图在两个网站上验证 JSON 字符串 - https://jsoneditoronline.org/ 和 https://jsonlint.com/ 我什至在 Notepad++ 中粘贴了任何特殊字符的字符串,但没有找到。
【问题讨论】:
-
错误出现在哪一行?以及如何将对象保存在
SharedPreferences中? -
请查看有关问题的更新以了解保存详情。奇怪的是,我能够检索和打印同一活动中的值或其他片段中的整个字符串,就像上面一样。这是我无法解决的难题。感谢您的关注。
-
"address":"city":"city"部分是错误的,应该是"address": { ... }。 -
抱歉,这是一个复制和粘贴错误。在“city”属性之前添加了“{”,结尾“}”已经存在。