繁体   English   中英

在 Android Studio 中将嵌套的 JSON 反序列化为 Java

[英]De-serializing nested JSON to Java in Android Studio

我正在尝试将此 JSON反序列化为 class Mural的 Java 对象的数组,并在我的应用程序中的列表中显示它们(回收站视图) 这是 JSON 的格式化示例,仅包含我需要的数据。

{
"records": [{ 
    "recordid": "e6b10b2f7cadbe7caec9a0b36e9e7b570c3add50", 
    "fields": {
        "auteur_s": "Dupa", 
        "photo": {
            "id": "7cd8a2bc799826835057eaec21a28730", 
            },
        "annee": "1994",
        "coordonnees_geographiques": [50.8527886675, 
                          4.34530735016], 
        "personnage_s": "Cubitus - Dommel"
        }, 
    },
    ...
    ]
}

我使用 Okhttp 发出请求并且响应成功,所以我使用它来构造一个 JSONObject。 我遍历了 object 中的"records"数组,因为在那里我找到了我需要的所有数据。 具有字符串或数组作为值的键工作正常,我可以将它们加载到我的应用程序的 Recycler 视图中,但是当我想访问"photo"时,即嵌套在另一个 object 中的键:值对时,我得到一个 JSONException org.json.JSONException: No value for photo ,我的回收站视图返回空。

代码如下所示:

private void fetchMurals(){
        threadExecutor.execute(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url("https://bruxellesdata.opendatasoft.com/api/records/1.0/search/?dataset=comic-book-route&rows=58")
                        .get()
                        .build();
                try{ 
                    Response response = client.newCall(request).execute();
                    String json = response.body().string();

                    JSONObject jsonObject = new JSONObject(json);
                    JSONArray jsonRecordsArray = jsonObject.getJSONArray("records");

                    int arraySize = jsonRecordsArray.length();
                    muralArrayList = new ArrayList<>();

                    for (int i = 0; i < arraySize; i++){
                        String jsonID = jsonRecordsArray.getJSONObject(i).getString("recordid");
                        JSONObject jsonMural = jsonRecordsArray.getJSONObject(i).getJSONObject("fields");
                        JSONObject jsonMuralPhoto = jsonMural.getJSONObject("photo");

                        final Mural currentMural = new Mural(
                                jsonID,
                                (jsonMural.has("auteur_s")) ? jsonMural.getString("auteur_s") : "Unknown Author",
                                (jsonMuralPhoto.has("id")) ? jsonMuralPhoto.getString("id") : "No picture available!",
                                (jsonMural.has("personnage_s")) ? jsonMural.getString("personnage_s") : "Unknown character",
                                (jsonMural.has("annee")) ? jsonMural.getString("annee") : "Unknown year of creation",
                                new LatLng(jsonMural.getJSONArray("coordonnees_geographiques").getDouble(0),
                                           jsonMural.getJSONArray("coordonnees_geographiques").getDouble(1))
                        );
                        muralArrayList.add(currentMural);

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

我已经尝试了很多变体,但到目前为止都没有奏效。 我的循环可能有问题吗? 还是使用我正在调用的jsonMural.getJSONObject("photo")

我现在看到我正在检查我的记录是否有“id”字段,而我应该检查它是否有“照片”。 我将构造函数中的行更改为

(jsonArtwork.has("photo")) ? jsonArtwork.getJSONObject("photo").getString("id") : "No picture available!"

现在工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM