Невозможно десериализовать объект массивов gson в Java - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь десериализовать объект JSON в Java, но gson.fromJson(), похоже, не работает. Это дает null значение после десериализации.

У меня есть json ответ такой:

{
    "master": [{
        "data": {
            "getStoreItem": {
                "gtin": "84",
                "storeId": "49",
                "locations": {
                    "salesfloor": [{
                        "aisle": "5",
                        "aisleDesc": "5"
                    }]
                },
                "pricing": {
                    "retailPrice": 11.28,
                    "hoRetailPrice": null
                },
                "basicInfo": {
                    "itemNumber": 87,
                    "departmentNumber": 1
                },
                "inventory": {
                    "onHandQuantity": 358,
                    "inTransitQuantity": 0
                },
                "restrictions": {
                    "isAssociateDiscountable": false
                },
                "itemAssociatedGtins": [{
                    "gtin": "847"
                }]
            }
        }
    }, {
        "data": {
            "getStoreItem": {
                "gtin": "97",
                "storeId": "4",
                "locations": {
                    "salesfloor": [{
                        "aisle": "1",
                        "aisleDesc": "1"
                    }]
                },
                "pricing": {
                    "retailPrice": 19.98,
                    "hoRetailPrice": null
                },
                "basicInfo": {
                    "itemNumber": 871,
                    "departmentNumber": 1
                },
                "inventory": {
                    "onHandQuantity": 56,
                    "inTransitQuantity": 0
                },
                "restrictions": {
                    "isAssociateDiscountable": false
                },
                "itemAssociatedGtins": [{
                    "gtin": "9754610200"
                }]
            }
        }
    }]
}

У меня есть Master.java класс, подобный этому -

import java.util.List;

public class Master {

    List<Data> data;

    public List<Data> getData() {
        return data;
    }
    public void setData(List<Data> data) {
        this.data = data;
    }
    public static class Data {

        private GetStoreItem getStoreItem;
            public GetStoreItem getGetStoreItem() {
                return getStoreItem;
            }

            public void setGetStoreItem(GetStoreItem getStoreItem) {
                this.getStoreItem = getStoreItem;
            }

            public static class GetStoreItem {

                private String gtin;
                private String storeId;

                public String getGtin() {
                    return gtin;
                }

                public void setGtin(String gtin) {
                    this.gtin = gtin;
                }

                public String getStoreId() {
                    return storeId;
                }

                public void setStoreId(String storeId) {
                    this.storeId = storeId;
                }

            }
    }
}

Когда я делаю:

Master m = gson.fromJson(json, Master.class);

m содержит:

data: null

Невозможно понять, где я иду не так.

1 Ответ

0 голосов
/ 03 февраля 2020

Ваш класс верхнего уровня должен иметь поле master типа List, поскольку в вашем JSON, master является ключом в паре ключ-значение в объекте JSON верхнего уровня и его значение представляет собой массив JSON.

Кроме того, поле data должно иметь тип Data вместо List из Data, поскольку в вашем JSON значения, соответствующие data ключи - это JSON объекты.

class StoreData {
    private List<StoreItem> master;

    static class StoreItem {
        private Data data;
    }

    static class Data {
        @SerializedName("getStoreItem")
        private GeneralData generalData;
    }

    static class GeneralData {
        private String gtin, storeId;
    }
}
StoreData storeData = new Gson().fromJson(json, StoreData.class);

Некоторые другие примечания:

  • Здесь нет причин создавать вложенный класс в другом вложенном класс (например, в вашем примере вы можете сделать GetStoreItem вложенным классом Master вместо вложенного класса Data).
  • Вы можете использовать @SerializedName если ваш JSON не соответствует Java соглашениям об именах (например, в вашем примере GetStoreItem нарушает соглашения).
...