当前位置: 首页 > 知识库问答 >
问题:

java类型的值。无法将lang.String转换为JSONObject-Android

汪阳辉
2023-03-14


我将客户数据对象存储为共享首选项(Android)中的JSON字符串,并尝试检索转换回客户对象的字符串并用于验证。从对象到JSON字符串的转换非常好,并且存储在首选项中(作为键值(字符串)对)。
当我尝试使用SharedP创建JSONObject或数组(它不是数组,但还是尝试了)references.get字符串(键")-我总是得到相同的错误值...类型java.lang.字符串不能转换为JSONObject。
我希望一双不同的眼睛能捕捉到我不能捕捉到的东西。带有数据的错误消息(屏蔽):
Value

{"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
我要做的就是(代码要点):
使用以下命令保存到共享pref:

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/我甚至在记事本上粘贴了任何特殊字符的字符串,但没有找到。

共有3个答案

颛孙国源
2023-03-14

解决方案包括来自其他帖子的答案。我必须做:

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

奇怪的是SharedReferences的值中有如下精确的字符串(包括开始和结束引号(““”)。不确定为什么会出现问题,只是作为参数传递。硬编码到字符串变量中时,引号和转义字符被忽略:

"{\"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-14

试试下面

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);
}
邴景山
2023-03-14

可能是这样的情况,您试图将默认的字符串转换为JSONObject的空字符串。请确保您在prefJsonby中获得一个值,确保您已经用正确的键初始化了Shared首选项,并且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())

因为用你的值硬编码字符串是有效的。

 类似资料:
  • 在这里,我试图将数据发送到我的web服务器,并使用解析json并将数据插入mysql数据库。我得到一个错误,表示值stdClass为

  • 我正在开发一个android应用程序,我正在尝试使用Volley库。我无法解决的问题是关于JSON的。我检查了我的php文件、结果和Java代码,但仍然得到相同的错误。 有趣的是,截击日志不显示错误消息,但日志显示错误消息。 和 这是我的PHP代码: 结果如下: 和我的Java代码: 我也听说了GSON。这是解决办法吗?有人能帮帮我吗?提前感谢!!

  • 我正在抛出一个JSON异常,我不知道为什么会抛出它。我已经看了几乎所有和我一样的问题,但我认为我的不同。因此,我从一个网页获得一个JSONArray,它发送的JSON是有效的(我用验证器检查了它)。在JSONArray上执行getJSONObject时引发异常。 这正是它所说的(个人信息被标出): 这是我的Java代码: 错误发生在我去的行: 任何帮助都非常感谢。

  • 我开发了一个Android应用程序,请求从响应JSON格式的服务器的位置坐标(目前它只发送两个地方): 这是来自服务器的php代码: 当应用程序获取坐标时,它会尝试以这种方式解析坐标: getplaces(): JSONParser: 下面是带有错误的JSON: 当应用程序试图解析JSON响应时,它会崩溃,并发送一个JSON异常:类型java.lang.字符串的值不能转换为JSONObject如何

  • 问题内容: 我有一个JSON文件,其中包含2个JSON数组:一个用于路线的数组,一个用于景点的数组。 一条路线应由用户导航到的多个景点组成。不幸的是我遇到了错误: JSONException:无法将类型为java.lang.String的值转换为JSONObject 这是我的变量和解析JSON文件的代码: Log.i(“ JSON Parser”,json); 告诉我在生成的字符串的开头有一个奇怪

  • 任务控制器 创造jsp 在控制器中,我用相同的错误(以及不同的格式,如“yyyy/MM/dd”)编写了以下内容 我还尝试在类中添加注释(以及使用不同的格式),但出现了相同的错误