У меня есть 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(',') не будет работать
У массивов @Enowneb нет ключей, мой json - это только массивы
@HiteshKhatri мой json - это только массивы
Вы можете создать свой собственный 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 также работает. в любом случае спасибо орз
вы можете загрузить json с парой ключ-значение