Klaxon:期待一个名字,但得到了 LEFT_BRACE
Klaxon: Expected a name but got LEFT_BRACE
如何使用 Klaxon 阅读 "complex" 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,如下例所示,我会收到以下错误:"Expected a name but got LEFT_BRACE"
val objectString = """{
"name" : "Joe",
"age" : 23,
"flag" : true,
"array" : [1, 3],
"obj1" : {
"hello": { "a" : 1, "b" : 2 }
}
}"""
我在 github 存储库中没有看到任何报告的问题,所以我想知道是否有办法让它工作。
干杯
好的,所以我查看了源代码,似乎 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()
如何使用 Klaxon 阅读 "complex" 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,如下例所示,我会收到以下错误:"Expected a name but got LEFT_BRACE"
val objectString = """{
"name" : "Joe",
"age" : 23,
"flag" : true,
"array" : [1, 3],
"obj1" : {
"hello": { "a" : 1, "b" : 2 }
}
}"""
我在 github 存储库中没有看到任何报告的问题,所以我想知道是否有办法让它工作。
干杯
好的,所以我查看了源代码,似乎 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()