【问题标题】:Unable to parse sub items using JSON [closed]无法使用 JSON 解析子项目 [关闭]
【发布时间】:2014-12-09 06:24:55
【问题描述】:

我在正确解析我的 json 格式时遇到了一些麻烦,我想知道是否有人可以展示如何在这种情况下正确解析数据:

来源:

  try {
            HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
            InputStream is = conn.getInputStream();
            BufferedReader r = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            for(String line = r.readLine(); line != null; line = r.readLine()){
                sb.append(line);
            }
            JSONArray jsonArray = new JSONArray(sb.toString());
            for(int i = 0; i < jsonArray.length(); i++){
                JSONObject obj = jsonArray.getJSONObject(i);
                String sha = obj.getString("sha");
                String name = obj.getString("name");
                String message = obj.getString("message");
                Log.d("sha", sha);
                Log.d("name", name);
                Log.d("message", message);

            }
        } 

错误:

“名称无价值”

JSON 数据:

http://pastebin.com/0FJUGm3L

【问题讨论】:

标签: java android json stringbuilder arrays


【解决方案1】:

如果您将 JSON 加载到此 JSON Viewer 工具中,您会发现您具有以下 JSON 结构:

现在,既然要获取sha, commit message, and commiter name,就需要深入了解json的对象结构。

  1. 首先,您需要循环整个 json 数组:

    for(int i = 0; i < jsonArray.length(); i++){
        JSONObject currentObj = jsonArray.getJSONObject(i);
    
  2. 在循环中,你需要找到“sha”在哪里。再次查看该结构,您会发现它就在对象下方。所以你只需要使用getString():

    String sha = currentObj.getString("sha");
    
  3. 要获得提交message,因为它在commit 对象下,您需要先读取该对象,然后再读取message

    JSONObject objCommit = currentObj.getJSONObject("commit");
    String commitMessage = objCommit.getString("message");
    
  4. 最后一篇是获取作者的name。同样,请注意 name 存储在 author 对象下。因此,您需要先阅读该内容。由于author 对象存储在commit 对象下,您可以通过objCommit 读取提交对象来获取作者:

    JSONObject objAuthor = objCommit.getJSONObject("author");
    String authorName = objAuthor.getString("name");
    
  5. 剩下的看你自己了 :)

无私插件:另外,如果您在阅读或遍历 JSON 时遇到困难,那么 SO 问题可以派上用场:JSON Parsing Error

【讨论】:

    【解决方案2】:

    所有键名、消息、.. 都在author JSONObject 中。从author 对象中获取所有值:

     for(int i = 0; i < jsonArray.length(); i++){
                    JSONObject obj = jsonArray.getJSONObject(i);
                    String sha = obj.getString("sha");
                    // get commit  object
                    JSONObject objcommit = obj.getJSONObject("commit"); 
                    // get author  object
                    JSONObject objauthor = objcommit.getJSONObject("author");
                    String name = objauthor.getString("name");
                    String message = objauthor.getString("message");
                    Log.d("sha", sha);
                    Log.d("name", name);
                    Log.d("message", message);
    
                }
    

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多