【问题标题】:How to parse the following JSON如何解析以下 JSON
【发布时间】:2015-12-09 09:54:58
【问题描述】:

在这里,我从本地资产文件夹中获取了 JSON。所有 JSON 对象的名称都不同。第 1、3、5、7 行 .... 最多 1000。特此附上 json 供您参考。

     {
    "status": {
        "rcode": 200,
        "message": "OK"
    },
    "data": {
        "0": {
            "OutletName": "Test 1 ",
            "Latitude": "16.123234",
            "Longitude": "79.546745"
        },
        "1": {
            "OutletName": "Test 2",
            "Latitude": "16.343234",
            "Longitude": "79.786745"
        },
        "2": {
            "OutletName": "Test 3",
            "Latitude": "19.1294",
            "Longitude": "72.836122"
        },
        "3": {
            "OutletName": "Test 4",
            "Latitude": "19.136383",
            "Longitude": "72.827997"
        },
        "6": {
            "OutletName": "Test 5",
            "Latitude": "19.136715",
            "Longitude": "72.829248"
        },
        "7": {
            "OutletName": "Test 6",
            "Latitude": "19.128483",
            "Longitude": "72.821199"
        },
        "8": {
            "OutletName": "Test 7",
            "Latitude": "19.128528",
            "Longitude": "72.819388"
        },
        "10": {
            "OutletName": "Test 8",
            "Latitude": "19.140333",
            "Longitude": "72.831095"
        },
        "11": {
            "OutletName": "Test 9",
            "Latitude": "19.14027",
            "Longitude": "72.826285"
        }
    }
}

这里的对象名称对所有人都不同。所以我尝试这样

private void parseJson() {
        try {
            JSONObject obj = new JSONObject(loadJSONFromAsset());
            JSONObject jObj = obj.getJSONObject("data");
            System.out.println("jObj.length()==> " + jObj.length());
            for (int i = 0; i < jObj.length(); i++) {

                if (jObj.has(String.valueOf(i)) && !jObj.isNull(String.valueOf(i))) {
                    JSONObject jObj1 = jObj.getJSONObject(String.valueOf(i));
                    System.out.println("Index==> "+i);
                    System.out.println("OutletName==> "+jObj1.getString("OutletName"));
                  }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

但是在这里我没有得到所有的数据。请帮我解析这种 JSON。

提前致谢。

【问题讨论】:

  • 好像你的 json 是错误的。请在解析之前发布完整的 json 或在 jsonlint.com 上检查 json 中的任何错误。
  • 正如 Jolson 指出的那样,“7”行有错误:{“OutletName”:“Test 6”,“Latitude”:“19.128483”,“Longitude”:“72.821199”,}, ......那里,在经度字符串结束后......在其他对象之后类似,也先纠正它
  • 正如 Jolson 所说,你的 JSon 对象是错误的,你需要有一个 dataJsonkey 的 JSon 数组
  • 对不起。我已经编辑了 json 字符串。抱歉,这是一个测试/示例 json。真正的 json 将来自服务器。这也是同样的格式。请帮我解析这个json。
  • 真的,你应该抓住那个制作 JSON 结构的人,友好地解释一下数组是什么。

标签: java android json


【解决方案1】:

您需要像这样使用keys 方法:

private void parseJson() {
    try {
        JSONObject obj = new JSONObject(loadJSONFromAsset());
        JSONObject jObj = obj.getJSONObject("data");
        Iterator iter = jObj.keys()
        while(iter.hasNext()) {
            String key = (String) iter.next();
            JSONObject jObj1 = jObj.getJSONObject(key);
            System.out.println("Index==> "+ key);
            System.out.println("OutletName==> "+jObj1.getString("OutletName"));
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }
}

编辑: 修复了一些类型转换

【讨论】:

    【解决方案2】:

    JSON 中“数据”的值不是数组,因此您不能直接对其进行迭代。您需要先将其转换为 HashMap,然后遍历键集。您可以使用Jackson library 将 JSONObject 转换为 HashMap。也可以参考this answer转成map。

    【讨论】:

    • 谢谢你的回答。这对我也有帮助。我从@DereK Fung 那里得到了解决方案。!!
    【解决方案3】:

    首先,您必须对 json 响应进行更改

     {
        "status": {
            "rcode": 200,
            "message": "OK"
        },
        "data": {                   //this has to be array in your json
    
            "0": {                            //  and these are object inside the arrays
                "OutletName": "Test 1 ",
                "Latitude": "16.123234",
                "Longitude": "79.546745"
            },
            "1": {                                    //  and these are object inside the arrays
                "OutletName": "Test 2",
                "Latitude": "16.343234",
                "Longitude": "79.786745"
            },
            "2": {
                "OutletName": "Test 3",
                "Latitude": "19.1294",
                "Longitude": "72.836122"
            },
            "3": {
                "OutletName": "Test 4",
                "Latitude": "19.136383",
                "Longitude": "72.827997"
            },
            "6": {
                "OutletName": "Test 5",
                "Latitude": "19.136715",
                "Longitude": "72.829248"
            },
            "7": {
                "OutletName": "Test 6",
                "Latitude": "19.128483",
                "Longitude": "72.821199"
            },
            "8": {
                "OutletName": "Test 7",
                "Latitude": "19.128528",
                "Longitude": "72.819388"
            },
            "10": {
                "OutletName": "Test 8",
                "Latitude": "19.140333",
                "Longitude": "72.831095"
            },
            "11": {
                "OutletName": "Test 9",
                "Latitude": "19.14027",
                "Longitude": "72.826285"
            }
        }
    }
    

    并且不要超过 json 对象的大小来访问它的对象,它必须是 JSONArray 像这样在 JSONArray 中获取数组数据

    JSONArray dataArray = response_obj.getJSONArray("data");
    

    然后像这样迭代

    for (int i = 0; i < dataArray.length(); i++) 
    {
       //write your code here to access all the object as for loop executes on by one
    }
    

    【讨论】:

    • 感谢您的努力..我从@DereK Fung 那里得到了解决方案..!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2013-05-31
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多