Данные JSON с использованием Kotlin - PullRequest
0 голосов
/ 05 октября 2018

В настоящее время я работаю над приложением, и я хотел бы получить JSON-извлечение в класс, но это немного сложнее, чем просто сопоставить поле.Я использую Moshi для управления JSON.

Ниже представлен JSON, который у меня есть:

{
  "common" :{
    "source_url": "xxxx",
    "target_url": "yyy
  },
  "specific":{
    "A":{
      "setting": "ccc",
    },
    "B":{
      "setting": "ddd",
    }
  }
}

Цель для меня - получить объект на основе класса данных, который выглядит следующим образом:

data class config(
    val sourceUrl: String,
    val targetUrl: String,
    val setting: String
)

Я начал с того, что сначала создал другой класс данных, чтобы позволить мне манипулировать данными перед получением объекта класса выше.

- GeneralConfig.kt

data class GeneralConfig(
    val common: CommonConfig,
    val specific: Specific
)

- CommonConfig.kt

data class CommonConfig(
    @Json(val name = "source_url") sourceUrl: String,
    @Json(val name = "target_url") val targetUrl: String
)

- SpecificConfig.kt

data class SpecificConfig(
    setting: String,
)

У меня есть 2 основных вопроса:

  • Как я могу получить доступ к «конкретным» «A / B» данным и получить класс объекта SpecificConfig.Могу ли я в моем generalConfig классе данных напрямую извлечь одно поле из specific и выбрать A или B, передав аргумент

  • Можно ли избежать создания нескольких данныхкласс, чтобы получить мой последний объект класса config

Цель состоит в том, чтобы иметь json, содержащий общие данные и конкретные данные.Мне нужно создать окончательный класс данных, который объединяется с общими данными и одним из конкретных данных.

Есть идеи?Спасибо

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я бы предпочел создавать классы для каждого запроса и не анализировать их вручную

data class GeneralConfig(
        @SerializedName("common") val common: CommonConfig,
        @SerializedName("specific") val specific: Specific
                        )

data class CommonConfig(
        @SerializedName("source_url") val sourceUrl: String,
        @SerializedName("target_url") val targetUrl: String
                 )

data class Specific(
        @SerializedName("A") val a: SpecificSettings,
        @SerializedName("B") val b: SpecificSettings
                 )

data class SpecificSettings(
        @SerializedName("setting") val setting: String
                 )
0 голосов
/ 05 октября 2018

Попробуйте это 1. Измените свой

data class SpecificConfig(
    setting: String,
)

На

data class SpecificConfig(
@Json(val name = "A") val a : JsonObject,
    @Json(val name = "B") val b: JsonObject
)

Второй: создайте еще 2 класса, т.е.

data class AConfig(
    setting: String,
)

data class BConfig(
    setting: String,
)

Третий: измените

data class config(
    val sourceUrl: String,
    val targetUrl: String,
    val setting: String
)

К

data class config(
    val sourceUrl: String,
    val targetUrl: String,
    val setting: String,
    val a: JsonObject,
    val b: JsonObject
)
...