【问题标题】:Value of type java.lang.String cannot be converted to JSONObject - Androidjava.lang.String 类型的值无法转换为 JSONObject - Android
【发布时间】: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”属性之前添加了“{”,结尾“}”已经存在。

标签: android json


【解决方案1】:

可能是您尝试将默认 string 的空字符串转换为 JSONObject 的情况。 确保您在 prefJson 中通过 获取值,确保您已使用正确的密钥初始化 SharedPreferences,并且 getString() 的密钥也是正确的。

    var s ="{\"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\"}";
    val regisCustomer = JSONObject(s)
    println(regisCustomer.toString())

由于使用您的值对字符串进行硬编码有效。

【讨论】:

  • 是的,你是对的 - 我也先尝试过,对值进行硬编码以查看它是否有效,它确实有效。但是由于某种原因,当我直接传递值时它不会!
【解决方案2】:

试试下面

Gson gson = new GsonBuilder().create();
public static <T> T someMethod(String prefKey, Class<T> type) {
   String prefJson = settings.getString(prefKey, "");
   return gson.fromJson(prefJson , type);
}

【讨论】:

  • 我们正在使用 Moshi,因此意味着要再添加一个库或进行其他更改。此外,Moshi 的工作模式与您提到的模式类似。可能正在尝试一些愚蠢的事情 - 尝试将 JSON 存储为字符串并检索该字符串以使其成为 JSONObject 并执行我们需要的任何操作。感谢您的关注。
【解决方案3】:

解决方案包括来自其他post 的答案。 我必须这样做:

   prefJson= prefJson.replace("\\\"", "\"");
   prefJson = prefJson.substring(prefJson.indexOf("{"), prefJson.lastIndexOf("}") + 1);

奇怪的是,sharedpreferences 具有如下的确切字符串(包括值中的开始和结束引号('"')。不知道为什么这是一个问题,仅当作为参数传递时。引号和转义硬编码到字符串变量时忽略字符:

"{\"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\":\"PA 12345\",\"street\":\"Lane 2, Street 2\"},\"ageGroup\":\"25-45\",\"dateOfBirth\":\"1537368909000\",\"email\":\"abc@abc.com\",\"firstName\":\"First Name\",\"gender\":\"\",\"id\":\"119\",\"lastName\":\"Last Name\",\"locale\":\"en_us\",\"middleName\":\"none\",\"phone\":\"0987654321\",\"uuid\":\"8c3ce2c5-600f-3c4e-bc07-727d61fae7ff\"}"  

必须转换为:

{"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":"PA 12345","street":"Lane 2, Street 2"},"ageGroup":"25-45","dateOfBirth":"1537368909000","email":"abc@abc.com","firstName":"First Name","gender":"","id":"119","lastName":"Last Name","locale":"en_us","middleName":"none","phone":"0987654321","uuid":"8c3ce2c5-600f-3c4e-bc07-727d61fae7ff"}  

注意:版主,如果这听起来重复,请随时删除或合并此问题。谢谢大家。

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2021-10-23
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2017-10-02
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多