【问题标题】:Klaxon: Expected a name but got LEFT_BRACEKlaxon:需要一个名字,但得到了 LEFT_BRACE
【发布时间】:2018-01-16 00:57:56
【问题描述】:

如何使用 Klaxon 读取“复杂”的 json? 我正在尝试使用 klaxon 的流 api as documentation say

我正在使用 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 存储库中没有看到任何报告的问题,所以我想知道是否有办法让它工作。

干杯

【问题讨论】:

标签: json kotlin klaxon


【解决方案1】:

好的,所以我检查了源代码,似乎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 指的是顶级对象。

希望这会有所帮助。

【讨论】:

  • 我试图只使用流 api,但似乎必须这样,谢谢@TGO
【解决方案2】:

使用 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()

【讨论】:

  • 那将是一个嵌套的beginObject()?如果是,我是否必须启动一个新的 JsonReader?我也遇到了同样的问题,能否请您根据原始问题中的示例说明如何操作?
猜你喜欢
  • 2021-08-31
  • 2021-07-20
  • 1970-01-01
  • 2021-07-03
  • 2021-06-03
  • 2021-01-22
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多