Получить значение Json с Gson - PullRequest
1 голос
/ 07 февраля 2020

Я не приезжаю, чтобы получить имя containerStatuses. Я пробовал это (относительно прецедентного поста), об ошибке сообщают о get ("name") с "Метод get (String) не определен для типа JsonElement".

Спасибо за помощь

JsonObject data = new Gson().fromJson(myjsoncontent, JsonObject.class);
JsonArray items = data .get("items").getAsJsonArray();      
    for(JsonElement element : items){
         JsonObject object = element.getAsJsonObject();
         String containerstatusesname = object.get("status").getAsJsonObject().get("containerStatuses").getAsJsonArray().get(0).get("name").getAsString();
}

// My Json Content

{
    "kind": "Space",
    "apiVersion": "v1",
    "metadata": {
        "selfLink": "something",
        "resourceVersion": "something"
    },
    "items": [
        {
            "status": {
                "containerStatuses": [
                 {
                   "name": "thisismyname"
                 }
                ]               
            }
        } 
    ]
}

Ответы [ 3 ]

3 голосов
/ 07 февраля 2020

Почему вы используете эмуляцию gson JSON .parse? Использует кувалду, чтобы взломать орех.

Если вы хотите использовать gson, лучше создать класс, который соответствует вашим json данным как:

public class ApiResponse {

    private String kind;
    private String apiVersion;
    private Metadata metadata;
    private List<Item> items;

    public List<String> getAllNames() {
        List<String> allNames = new ArrayList();
        for (Item item: items) {
            allNames.add(item.getStatus().get(0).getName());
        }
        return allNames;
    }

    public String getFirstName() {
        if (items.length == 0 || items.get(0).getStatus().length == 0) {
            return "";
        }
        return items.get(0).getStatus().get(0).getName();
    }

    class Metadata {
        private String selfLink;
        private String resourceVersion;
    }

    class Item {
        private List<StatusContainer> status;

        List<StatusContainer> getStatus() {
            return status;
        }
    }

    class StatusContainer {
        private String name;

        String getName() {
            return name;
        }
    }
}

, а затем выполнить:

ApiResponse response = gson.fromJson(myjsoncontent, ApiResponse.class);
String firstName = response.getFirstName();

И таким образом объект ответа будет содержать все данные проанализированного json. Обратите внимание, что вам нужно добавить геттеры для доступа к этим свойствам, если они являются частными.

Нет необходимости эмулировать результат JSON .parse и иметь JsonObject, JsonArray ...

1 голос
/ 07 февраля 2020

Получить элемент массива как объект, потому что он структурирован как объект

.getAsJsonArray().get(0).getAsJsonObject().get("name").getAsString();
1 голос
/ 07 февраля 2020

Вы должны изменить

.get(0).get("name")

на

.get(0).getAsJsonObject().get("name")

JsonArray возвращает JsonElement с, когда вы повторяете его

...