JSON-разбор дает мне JsonSyntaxException - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь преобразовать строку ответа с JSON внутри внутри объекта, используя Gson, но я сталкиваюсь с исключением, которое, я думаю, было вызвано двойными кавычками или чем-то еще.

Результат конвертирования выглядит следующим образом:

    {
  "params": {
    "data": {
      "user": "USER01",
      "token": "924e24fdd200760b3bb",
      "language": "es-ES"
    },
    "path": "funds",
    "method": "POST",
    "okCallback": "SUCESS",
    "koCallback": "ERROR"
  }
}

У меня есть пользовательский объект для анализа этого ответа.

public class HybridParams {

    @SerializedName("method")
    @Expose
    private String method;
    @SerializedName("path")
    @Expose
    private String path;
    @SerializedName("data")
    @Expose
    private String data;
    @SerializedName("okCallback")
    @Expose
    private String okCallback;
    @SerializedName("koCallback")
    @Expose
    private String koCallback;

И я пытаюсь сделать:

new Gson().fromJson(requestJson, HybridRequest.class);

Но я получаю и ошибку:

Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 20 path $.params.data

Любой совет ??Спасибо

Ответы [ 4 ]

1 голос
/ 14 мая 2019

Вы пытаетесь десериализовать объект данных в JSON в объект String. Определите класс для объекта Data и измените тип данных в HybridParams.

@Expose
private DataParams data;

А Класс данных:

public class DataParams {

    @Expose
    private String user;
    @Expose
    private String token;
    @Expose
    private String language;
}
0 голосов
/ 14 мая 2019

Ромен правильный, но просто хочу кое-что сказать о @SerializedName и @ Expose.

Вам не нужно использовать обе аннотации в вашем случае.

@SerializedName("method")
@Expose
private String method;

совпадает с:

@Expose
private String method;

Итак, @Expose включен в @SerializedName, нет необходимости в обоих.

Если у вас все в порядке со свойством API в этом случае 'method', нет необходимости добавлять @ SerializedName.

Если свойство API имеет имя, отличное от вашего свойства Class, вы используете @SerilizedName (и вы можете избежать @Expose).

@ Expose также имеет еще одну роль. Анализатор JSON работает в двух направлениях: сериализация и десериализация, и вы можете отключить одно направление с помощью @Expose (serialize = false) или @Expose (deserialize = false)

0 голосов
/ 14 мая 2019

Данные являются объектом JSON.Но вы анализируете его под типом данных String.Следовательно, Ошибка: ожидалось STRING, но было BEGIN_OBJECT;это означает, что компилятор ожидал String (как определено ВАМИ), но был BEGIN_OBJECT (как в данных).Ваше решение - изменить либо определение, либо данные так, чтобы они оба совпадали.Удачи.

0 голосов
/ 14 мая 2019

Ваше поле data является объектом, и вы пытаетесь разыграть эту строку, так что только вы получите эту ошибку.

Вы должны попытаться добиться этого,

@SerializedName("data")
    @Expose
    private YourNewObject data;

Выможет анализировать пользователя, токен и язык из этого YourNewObject

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