Клаксон: Ожидаемое имя, но получил 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()

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