Как разобрать массив json в Kotlin

У меня есть json в val filestring: String, например

[
    [
        "あ",
        "",
        "",
        "",
        0,
        [
            "あ\n(1)五十音図ア行第一段の仮名。後舌の広母音。\n(2)平仮名「あ」は「安」の草体。片仮名「ア」は「阿」の行書体の偏。\n"
        ],
        0,
        ""
    ],
    [
        "足",
        "あ",
        "",
        "",
        0,
        [
            "あ 【足】\nあし。「―の音せず行かむ駒もが/万葉 3387」\n〔多く「足掻(アガ)き」「足結(アユイ)」など,複合した形で見られる〕\n"
        ],
        1,
        ""
    ],
    ...
]

и хотите разобрать его на kotlin.

У меня есть класс данных

data class TermBank (
    val text: String,
    val reading: String,
    val tags: String,
    val rules: String,
    val popularity: Int,
    val definition: List<String>,
    val sequenceNumber: Int,
    val tags2: String,
)

Я пробовал этот код с библиотекой gson

val obj = Gson().fromJson(fileString, Array<TermBank>::class.java)

и получить ошибку com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 3 path $[0]

Я также пробовал библиотеку сериализации kotlin.

val obj = Json.decodeFromString<Array<TermBank>>(fileString)

и получить ошибку kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 0: Expected start of the object '{', but had '[' instead at path: $[0] JSON input: [["あ","","","",0,["あ\n(1)五十音図ア.....

Редактировать: Насколько я понимаю, моя проблема связана с тем, что мой формат массив массивов [string, string, string, string, int, string array, int, string]. Я не уверен, как разобрать json этой формы.

Я также не могу придумать, как это сделать с помощью .split, поскольку в каждом массиве есть запятые, поэтому .split(',') не будет работать

вы можете загрузить json с парой ключ-значение

Hitesh Khatri 07.02.2023 09:55

У массивов @Enowneb нет ключей, мой json - это только массивы

Noah 07.02.2023 10:03

@HiteshKhatri мой json - это только массивы

Noah 07.02.2023 10:06
0
3
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать свой собственный Deserializer, чтобы преобразовать эти массивы строк в ваш объект TermBank:

class CustomDeserializer : JsonDeserializer<TermBank> {
  override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): TermBank {
    return if (json?.isJsonArray == true) {
      val array = json.asJsonArray
      TermBank(
        array.get(0).asString,
        array.get(1).asString,
        array.get(2).asString,
        array.get(3).asString,
        array.get(4).asInt,
        array.get(5).asString.split("\n"), // Not sure how you split here
        array.get(6).asInt,
        array.get(7).asString)
    } else {
      TermBank("", "", "", "", 0, listOf(), 0, "")
    }
  }
}

И вы можете создать Gson с помощью Deserializer, чтобы преобразовать JSON в List<TermBank>:

val gson = GsonBuilder().registerTypeAdapter(TermBank::class.java, CustomDeserializer()).create()
val type = object : TypeToken<List<TermBank>>() {}.type
val target = gson.fromJson<List<TermBank>>(arrayJson, type)
println(target.toString())

У вас должен получиться такой вывод:

[TermBank(text=あ, reading=, tags=, rules=, popularity=0, definition=[あ, (1)五十音図ア行第一段の仮名。後舌の広母音。, (2)平仮名「あ」は「安」の草体。片仮名「ア」は「阿」の行書体の偏。, ], sequenceNumber=0, tags2=), TermBank(text=足, reading=あ, tags=, rules=, popularity=0, definition=[あ 【足】, あし。「―の音せず行かむ駒もが/万葉 3387」, 〔多く「足掻(アガ)き」「足結(アユイ)」など,複合した形で見られる〕, ], sequenceNumber=1, tags2=)]

Большое вам спасибо. Я удивлен, что удаление .split и изменение элемента определения на String также работает. в любом случае спасибо орз

Noah 07.02.2023 10:57

Другие вопросы по теме