Android-JSON解析不使用“ setText”显示数据

时间:2018-09-12 00:57:24

标签: java android json

我有以下JSON信息。

{
    "version": 2,
    "locations": [{
        "id": "750",
        "geo": {
            "name": "Lord Howe Island",
            "state": "Lord Howe Island",
            "country": {
                "id": "au",
                "name": "Australia"
            },
            "latitude": -31.557,
            "longitude": 159.086
        },
        "astronomy": {
            "objects": [{
                "name": "moon",
                "days": [{
                    "date": "2018-09-05",
                    "events": [],
                    "moonphase": "waningcrescent"
                }]
            }]
        }
    }]
}

我想做的是打印到textView JSON中的一些细节(不是全部),所以我想要的输出如下:

名称:豪勋爵岛 国家:澳大利亚 月相:月牙减弱

但是,解析要在textView中打印的信息时我没有任何运气。我目前正在使用以下代码:

JSONArray JA = new JSONArray(data);
        for (int i = 0; i < JA.length(); i++) {
            JSONObject JO = (JSONObject) JA.get(i);
            JSONObject geo = JO.getJSONObject("geo");
            JSONObject astronomy = JO.getJSONObject("astronomy");
            singleParsed = "Name:" + geo.get("name") + "\n" +
                    "Latitude:" + JO.get("latitude") + "\n" +
                    "Longitude:" + JO.get("longitude") + "\n" +
                    "Phase: " + astronomy.get("moonphase") + "\n";
        }

然后显示以下数据:

protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);

        MainActivity.fetcheddata.setText(this.singleParsed);


    }
}

我可以只用打印所有数据

MainActivity.fetcheddata.setText(this.data);

但是,我也看到了textView和ALL Information中的标签,而不是我所关注的几个标签。

我在做什么错了?

非常感谢所有帮助

编辑:建议,目前正在研究中。

JSONArray JA = new JSONArray(data);
        for (int i = 0; i < JA.length(); i++) {
            JSONObject JO = (JSONObject) JA.get(i);
            JSONObject astronomy = JO.getJSONObject("astronomy");
            JSONArray objects = astronomy.getJSONArray("objects");
            JSONArray days = objects.getJSONObject(0).getJSONArray("days");
            Object moonphase = days.getJSONObject(0).get("moonphase");

            moon = "Name:" + days.get(Integer.parseInt("moonphase"));
        }

3 个答案:

答案 0 :(得分:1)

您遇到的问题是,即使位置是数组,对象还是对象,您都试图使用JSONObjects。

要使其正常工作,您将需要像这样遍历数组:

    JSONObject jo = new JSONObject(yourData);
    JSONArray locations = jo.getJSONArray("locations");

    for (int i = 0; i < locations.length(); ++i) {
        //iterate over each key, etc.
    }

在我看来,归根结底,如果您更改键,添加键等,这将是一团糟,并且很难维护。我建议您研究一下GSON之类的内容,然后仅创建视图模型您想要的数据。最后,您将得到如下结果:

List<T> yourObjects = gson.fromJson(jsonReader, X[].class);

然后,您可以单独访问所需的任何属性。

答案 1 :(得分:0)

无法直接从moonphase获得astronomy[]将定义一个数组,因此您可以这样做:

            "astronomy": {
                "objects": [{
                    "name": "moon",
                    "days": [{
                        "date": "2018-09-05",
                        "events": [],
                        "moonphase": "waningcrescent"
                    }]
                }]
            }
JSONObject astronomy = JO.getJSONObject("astronomy");
JSONArray objects = astronomy.getJSONArray("objects");
JSONArray days = objects.getJSONObject(0).getJSONArray("days");
JSONObject moonphase = days.getJSONObject(0).get("moonphase");

答案 2 :(得分:0)

假设您的json数据保持不变,而您的输出如您在上面编写的那样:

    JSONArray locations = data.getJSONArray("location");
    JSONObject loc = locations.getJSONObject(0);
    JSONObject geo = loc.getJSONObject("geo");

    JSONObject country = geo.getJSONObject("country");

    JSONObject astronomy = loc.getJSONObject("astronomy");
    JSONObject objects = astronomy.getJSONArray("objects").getJSONObject(0);
    JSONObject day = objects.getJSONArray("days").getJSONObject(0);

    StringBuilder result = new StringBuilder();
    String singleParsed = "Name:" + geo.getString("name") + "\n" +
            "Country: " + country.getString("name") +
            "Moon Phase: " + astronomy.getString("moonphase") + "\n";