com.google.gson.JsonSyntaxException: java .lang.IllegalStateException: ожидаемая строка, но была BEGIN_ARRAY - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь проанализировать входящий Json (приведенный ниже) объект Java, используя Gson. Json запрос кажется правильным, но я получаю следующее исключение при его синтаксическом анализе.

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 5 column 19 path $.metadata.
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226) ~[gson-2.8.5.jar:?]
        at com.google.gson.Gson.fromJson(Gson.java:927) ~[gson-2.8.5.jar:?]

Входящий Json запрос:

{
    "metadata": {
        "salesId": "123",
        "promoCode": "2010",
        "items": [
            {
                "0": {
                    "productCode": "1234",
                    "total": 169900
                },
                "1": {
                    "productCode": "4567",
                    "total": 19900
                }
            }
        ]
    }
}

Анализ логики c:

protected <T extends GenericModel> Optional<T> convertFromJson(final String json, final Class<T> clazz) {
        if (StringUtils.isEmpty(json)) {
            return Optional.empty();
        }
        return Optional.of(new Gson().fromJson(json, clazz));
    }

Java класс:

public class Metadata {
    private String salesId;
    private String promoCode;
    private ArrayList<Object> items = new ArrayList<Object>();

    public String getSalesId() {
        return salesId;
    }

    public void setSalesId(String salesId) {
        this.salesId = salesId;
    }

    public String getPromoCode() {
        return promoCode;
    }

    public void setPromoCode(String promoCode) {
        this.promoCode = promoCode;
    }

    public ArrayList<Object> getItems() {
        return items;
    }

    public void setItems(ArrayList<Object> items) {
        this.items = items;
    }

    @Override
    public String toString() {
        return "Metadata{" +
                "salesId=" + getSalesId() +
                "promoCode=" + getPromoCode() +
                "items=" + getItems() +
                '}';
    }
}

Обратите внимание, что метаданные. java - это внутренний класс.

Пытались разрешить вопрос, но не повезло. Кто-нибудь может дать мне знать, как это решить? ТИА.

Ответы [ 3 ]

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

Поскольку ваш json содержит все данные в атрибуте metadata, я создал новый POJO с полем metadata.

class ParentMetadata {
    private Metadata metadata;
    // getters and setters
}

И затем проанализировал json в POJO, используя следующий код:

ParentMetadata parentMetadata = new Gson().fromJson(jsonStr, ParentMetadata.class);

Это прекрасно работает для меня.

Кроме того, поскольку items имеет тип ArrayList<Object>, во время отладки я мог видеть, что items десериализовано как список LinkedTreeMap.

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

Я обнаружил проблему и подумал, что опубликую ее здесь, если кто-то сталкивается с той же проблемой. Я очистил проект и перестроил снова, и он работал нормально. Проблема была не с кодом в конце концов. Я прочитал это на ветке о библиотеках gson и попробовал. И это сработало для меня.

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

Я думаю, проблема в объекте items в json, который вы пытаетесь десериализовать.

В Metadata классе items это ArrayList<Object>, но это не не говорите gson, как его десериализовать.

Вместо этого вы должны попытаться создать еще один POJO для Item и затем сделать items ArrayList<Item>. Примерно так: Gson и десериализация массива объектов с массивами в нем

Вы можете проверить, является ли проблема items, закомментировав этот атрибут и отправив только salesId и promoCode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...