此问题与我之前的question
有关我可以成功地从URL到我的spring控制器获取json格式的String
现在我必须解码它
所以我确实喜欢以下
@RequestMapping("/saveName")
@ResponseBody
public String saveName(String acc)
{jsonObject = new JSONObject();
try
{
System.out.println(acc);
org.json.JSONObject convertJSON=new org.json.JSONObject(acc);
org.json.JSONObject newJSON = convertJSON.getJSONObject("nameservice");
System.out.println(newJSON.toString());
convertJSON = new org.json.JSONObject(newJSON.toString());
System.out.println(jsonObject.getString("id"));
}
catch(Exception e)
{
e.printStackTrace();jsonObject.accumulate("result", "Error Occured ");
}
return jsonObject.toString();
}
这是JSON字符串{ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": "john" }, { "id": 7418, "name": "RjhjhjR" } ] }
当我运行代码时,我收到错误
org.json.JSONException: JSONObject["nameservice"] is not a JSONObject.
我做错了什么?
答案 0 :(得分:2)
这不是JSONObject
,而是JSONArray
从你的问题:
{ "nameservice": [ { "id": 7413, "name": "ask" }, { "id": 7414, "name": "josn" }, { "id": 7415, "name": "john" }, { "id": 7418, "name": "RjhjhjR" } ] }
nameservice键后面的[
告诉你它是一个数组。它需要是一个{
来表示一个对象,但它不是
因此,更改您的代码以将其用作JSONArray
,然后迭代它的内容以获取其中的JSONObjects
,例如
JSONArray nameservice = convertJSON.getJSONArray("nameservice");
for (int i=0; i<nameservice.length(); i++) {
JSONObject details = nameservice.getJSONObject(i);
// process the object here, eg
System.out.println("ID is " + details.get("id"));
System.out.println("Name is " + details.get("name"));
}
有关详细信息,请参阅JSONArray javadocs
答案 1 :(得分:1)
当“nameservice”是JSONObjects数组而不是对象本身时,您似乎正在尝试获取JSONObject。你应该试试这个:
JSONObject json = new JSONObject(acc);
JSONArray jsonarr = json.getJSONArray("nameservice");
for (int i = 0; i < jsonarr.length(); i++) {
JSONObject nameservice = jsonarr.getJSONObject(i);
String id = nameservice.getString("id");
String name = nameservice.getString("name");
}
答案 2 :(得分:1)
如果您已经拥有Spring Framework,我不明白为什么要这样做。
查看MappingJackson2HttpMessageConverter并相应地配置您的ServletDispatcher。 Spring会自动将您的对象转换为JSON字符串,反之亦然。
之后,您的控制器方法将如下所示:
@RequestMapping("/saveName")
@ResponseBody
public Object saveName(@RequestBody SomeObject obj) {
SomeObject newObj = doSomething(obj);
return newObj;
}