如何解码JSONObject

时间:2014-12-20 09:42:33

标签: java json spring

此问题与我之前的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.

我做错了什么?

3 个答案:

答案 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;
}