Retrofit - Android - Обработка нескольких типов ключей и значений с помощью gson - PullRequest
0 голосов
/ 09 декабря 2018

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

Позвольте мне показать вам ответ json:

{
   "error":[

   ],
   "result":{
      "field1":[
         [
            1544258160,
            "57.15",
            "57.15",
            "57.15",
            "57.15",
            "0.00",
            "0.00000000",
            0
         ],
         [
            1544258220,
            "56.89",
            "56.89",
            "56.89",
            "56.89",
            "56.89",
            "2.94406281",
            1
         ]
      ],
      "field2":1544301240
   }
}

и вот представление класса pojo:

data class Response(val error: List<String>, val result: LinkedTreeMap<String, List<List<Result>>>)

data class Result(
    val time: Double,
    val open: String,
    val high: String,
    val low: String,
    val close: String,
    val vwap: String,
    val volume: String,
    val count: Double
)

Я знаю, что текущая структура не может представить формат json.но у меня закончились идеи.

Кстати, ошибка стека говорит следующее:

Expected BEGIN_OBJECT but was NUMBER

edit: добавление немного большего контекста

Я использую Gsonconverter дляМодифицированный строитель.

val retrofit = Retrofit.Builder().baseUrl(API_URL).client(client)
            .addConverterFactory(GsonConverterFactory.create()).build()

Ответы [ 4 ]

0 голосов
/ 16 июня 2019

это было давно, но все же я уже пришел к выводу о том, что мне нужно.

data class OHLCResponse(
private val error: List<String>,
val result: LinkedTreeMap<String, Any>)

Оказывается, что в классе LinkedTreeMap мне просто нужно было передать параметр типа второго класса как Any и он может быть приведен ко всему, что вам нужно.

также я оставляю здесь хороший инструмент, который может помочь вам отобразить ваши ответы json в простые объекты / DTO котлина:

https://app.quicktype.io/

спасибо всем за ваши ответы.

0 голосов
/ 09 декабря 2018

Вы можете создать Gson JsonDeserializer для типов filed1, filed2.Это более написанный вручную код, но таким образом вы можете проверить тип файла и вызвать правильный десериализатор.

0 голосов
/ 09 декабря 2018

да, что делает ошибку, так это ваше поле ответа (результат), оно отличается от type.however. Вы просто используете первый тип Response(val error: List<String>, val result:LinkedTreeMap<String, List<List<Result>>> получите все json.

, на мой взгляд, вы можете использоватьНиже приведены способы ее решения.

Во-первых, переопределите полученную модель, возможно, вы можете использовать объект Gson JsonObject, а при работе со значением не забудьте проверить тип.

Во-вторых, обсудите это с инженером-фоновым сервером., согласитесь на каждый тип ответа* надеюсь помочь вам.

0 голосов
/ 09 декабря 2018

Ваша проблема здесь:

"field2":1544301240

Вы определили, как показано ниже:

val result: LinkedTreeMap<String, List<List<Result>>>

, но вместо этого вы получите номер !!!

РЕДАКТИРОВАТЬ

Просто попробуйте это:

data class Response(val error: List<String>, val result: YourModel)

data class YourModel(val field1: LinkedTreeMap<String, List<List<Result>>>, val field2: Double)

data class Result(
    val time: Double,
    val open: String,
    val high: String,
    val low: String,
    val close: String,
    val vwap: String,
    val volume: String,
    val count: Double
)
...