Клаксон: Ожидаемое имя, но получил LEFT_BRACE
Как я могу прочитать "сложный" JSON с помощью Klaxon? Я пытаюсь использовать потоковый API Клаксона, как сказано в документации.
Я использую метод beginObject. Если я использую JSON, как указано в примере, все в порядке
val objectString = """{
"name" : "Joe",
"age" : 23,
"flag" : true,
"array" : [1, 3],
"obj1" : { "a" : 1, "b" : 2 }
}"""
Но если я пытаюсь проанализировать json с вложенным объектом, как в следующем примере, я получаю следующую ошибку: "Ожидается имя, но получено LEFT_BRACE"
val objectString = """{
"name" : "Joe",
"age" : 23,
"flag" : true,
"array" : [1, 3],
"obj1" : {
"hello": { "a" : 1, "b" : 2 }
}
}"""
Я не вижу проблем в репозитории github, поэтому мне интересно, есть ли способ заставить это работать.
ура
2 ответа
Итак, я проверил источник, и кажется, что nextObject()
Предполагается, что вы имеете дело с простым объектом значения ключа, где значения не являются объектами.
В любом случае, есть другой способ анализа JSON указанного вами формата, как показано ниже:
val objectString = """{
"name" : "Joe",
"age" : 23,
"flag" : true,
"array" : [1, 2, 3],
"obj1" : { "hello": {"a" : 1, "b" : 2 } }
}"""
class ABObj(val a: Int, val b: Int)
class HelloObj(val hello: ABObj)
class Obj(val name: String, val age: Int, val flag: Boolean, val array: List<Any>, val obj1: HelloObj)
val r = Klaxon().parse<Obj>(objectString)
// r is your parsed object
print(r!!.name) // prints Joe
print(r!!.array) // prints [1, 2, 3]
Классы, которые я создал, как показано ниже:
ABObj
представляет этот JSON:
{"a": 1, "b": 2}
HelloObj
представляет этот JSON:
{"hello": {"a": 1, "b": 2}}
И наконец, Obj
относится к объекту верхнего уровня.
Надеюсь это поможет.
С Streaming API вы сами отвечаете за разбор объектов и массивов, поэтому, когда вы встречаете имя "obj1", вам нужно запустить новый beginObject() { ... }
и разобрать этот объект там.
Связанная с вами документация делает именно это:
while (reader.hasNext()) {
val readName = reader.nextName()
when (readName) {
"name" -> name = reader.nextString()
"age" -> age = reader.nextInt()
"flag" -> flag = reader.nextBoolean()
"array" -> array = reader.nextArray()
"obj1" -> obj1 = reader.nextObject()