【问题标题】:java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONObjectjava.lang.ClassCastException:java.lang.String 无法转换为 org.json.JSONObject
【发布时间】:2020-03-04 20:02:42
【问题描述】:

我点击了 API,得到的响应为

{"headers":{"Keep-Alive":["timeout=4, max=500"],"Server":["Apache"],"X-Content-Type-Options":["nosniff"],"Connection":["Keep-Alive"],"Vary":["X-Forwarded-For"],"X-XSS-Protection":["1;mode=block"],"Content-Length":["451"],"Content-Type":["application/hal+json"]},"statusCodeValue":200,"body":"{\"id\":\"7199\",\"username\":\"johntest@example.com\",\"start_time\":1583212261,\"expire_time\":1583253338,\"sponsor_profile\":\"1\",\"enabled\":false,\"current_state\":\"disabled\",\"notes\":null,\"visitor_carrier\":null,\"role_name\":\"[Guest]\",\"role_id\":2,}

然后我尝试获取正文。我得到了正文,但我无法在正文下获取用户名。基本上我的主要目的是获取用户名。它会抛出这个错误

java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONObject

我试图获取用户名的逻辑。

ResponseEntity<String> resp = restTemplate.exchange(
                            reader.getAccountURL() + request.getUsername(),
                            HttpMethod.GET, entity, String.class);
JSONObject accountDetails = new JSONObject(resp);
Object getBody =  accountDetails.get("body");
Object alreadyExits = ((JSONObject) getBody).get("username");

我做错了什么?

【问题讨论】:

  • 尝试getJsonObject("body") 而不是get("body")
  • 看起来您的响应是 HTTP 响应的 JSON 化。因此,主体只是一个字符串值,它编码另一个 JSON 对象,因此您需要再次解析 body 值。
  • @Arnaud 当我这样做时,我得到了这个异常 org.json.JSONException: JSONObject["body"] is not a JSONObject。
  • @JoachimSauer。你能告诉我怎么做吗?

标签: java json


【解决方案1】:

按照步骤操作:

  1. 获取正文字符串:String bodyString= resp.getString("body");
  2. 将 bodyString 解析为 jsonObject:JSONObject body= new JSONObject(bodyString);
  3. 获取用户名:String usename= body.getString("username");

这应该可行。

【讨论】:

  • 我假设,您的 body 是有效 json 对象的字符串
  • 我试过了,但是提示找不到用户名
  • 打印你在正文字符串中得到的内容,看看它是否包含username,并更好地分享你的代码和输出
  • 它确实包含用户名。我已经在我的帖子中展示了它。
  • 这不应该发生。你试过我上面说的方法吗?如果是,你能分享你的代码和错误堆栈跟踪吗?
【解决方案2】:

JSONObject 只不过是一个适用于键值的映射。 如果键返回的值是映射(即键值对),则可以将其转换为 JSONObject,但在您的情况下,getBody.get("username") 返回johntest@example.com,这是一个简单的字符串,而不是键值对,因此您得到这个异常 使用:JSONObject getBody = accountDetails.getJsonObject("body") 或者你可以使用:

String bodyString= accountDetails.getString("body");
JSONObject getBody= new JSONObject(bodyString)

然后使用Object alreadyExits = ((String) getBody).get("username");,它应该可以正常工作。

【讨论】:

  • 当我尝试时它给了我这个:方法 get(String) 未定义为 String 类型
  • 你必须将 body 也变成 jsonobject 我已经更新了我的答案
  • 我试过了,但我得到了我在帖子中提到的同样的错误
  • 帖子中提到的json不是有效的json,能否请您给出正确的json以便调试..您可以在jsonformatter.curiousconcept.com验证它
猜你喜欢
  • 2013-07-25
  • 2021-08-04
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多