首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析JSON引发异常

解析JSON引发异常
EN

Stack Overflow用户
提问于 2013-01-27 00:11:22
回答 2查看 8.4K关注 0票数 0

我正试图解析JSON以获得很少的字段。下面是我的JSON-

代码语言:javascript
复制
{
   "id": "100000224942080000",
   "name": "Tech Geeky",
   "first_name": "Tech",
   "last_name": "Geeky",
   "link": "https://www.facebook.com/tech.geeky",
   "username": "tech.geeky",
   "work": [
      {
         "employer": {
            "id": "1854993931353456",
            "name": "Tech"
         },
         "location": {
            "id": "1119482345542155151",
            "name": "Santa Cruz, California"
         },
         "position": {
            "id": "280794135283124256",
            "name": "Senior"
         },
         "start_date": "2012-01"
      }
   ],
   "education": [
      {
         "school": {
            "id": "131182196916370",
            "name": "Fatima School, Gonda"
         },
         "year": {
            "id": "113125125403208",
            "name": "2004"
         },
         "type": "High School"
      }
   ],
   "gender": "male"
}

我需要从上面的JSON提取idnamefirst_namelast_namegender。下面是我写的程序,但它会抛出异常。我在这方面做错了什么?

代码语言:javascript
复制
public class JSONParser {

    private static final String URL = "https://graph.facebook.com/me?access_token=AAAG2HjMOAsEBAGBhjx2RqqLbOvnAZAxEPQ0X7ZC2JWY0YcQZDZDSSSAFTR";
    private static HashMap<String, String> output = null;

    public static void main(String[] args) throws Exception {

    StringBuilder builder = new StringBuilder();
    DefaultHttpClient httpclient = new DefaultHttpClient();
    output = new HashMap<String, String>();
    BufferedReader bufferedReader = null;
    try {
        HttpGet httpget = new HttpGet(URL);
        httpget.getRequestLine();
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        //System.out.println(response.getStatusLine());
        if (entity != null) {
        InputStream inputStream = entity.getContent();
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        for (String line = null; (line = bufferedReader.readLine()) != null;) {
            builder.append(line).append("\n");
        }
        JSONObject jsonObject = new JSONObject(builder.toString());
        JSONObject info = jsonObject.getJSONObject("id");
        parseJSONObject(info, output);
        }
    } catch (Exception e) {

    } finally {
        try {
        bufferedReader.close();
        httpclient.getConnectionManager().shutdown();
        } catch (IOException e) {

        }
    }
    }

    private static HashMap<String, String> parseJSONObject(JSONObject json,
        HashMap<String, String> output) throws JSONException {

    Iterator<String> keys = json.keys();
    while (keys.hasNext()) {
        String key = keys.next();
        String val = null;
        try {
        JSONObject value = json.getJSONObject(key);
        parseJSONObject(value, output);
        } catch (Exception e) {
        val = json.getString(key);
        }
        if (val != null) {
        output.put(key, val);
        }
    }
    return output;
    }

}

异常:-

代码语言:javascript
复制
org.json.JSONException: JSONObject["id"] is not a JSONObject.

注意:- JSON是正确的。在这里发布之前,我稍微修改了JSON。所以在这里复制粘贴可能出了什么问题。但假设JSON是对的..。不过,它还是抛出了一个例外。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-27 00:21:44

您可以通过获取它们的数据类型值来获得这些字段,如下所示:

代码语言:javascript
复制
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
String firstName = jsonObject.getString("first_name");
String lastName = jsonObject.getString("last_name");
String gender = jsonObject.getString("gender");
票数 3
EN

Stack Overflow用户

发布于 2013-01-27 00:13:08

文件末尾有一个后缀逗号:

代码语言:javascript
复制
"gender": "male",
----------------^

在尝试解析JSON之前,可以使用JSONLint来验证JSON是否有效。有些解析器可能有些松懈,可以原谅一些错误,但大多数是非常严格的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14543014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档