有没有一种方法可以使用lift-json库的JObject类来充当地图?
例如:
val json = """
{ "_id" : { "$oid" : "4ca63596ae65a71dd376938e"} , "foo" : "bar" , "size" : 5}
"""
val record = JsonParser.parse(json)
record: net.liftweb.json.JsonAST.JValue = JObject(List(JField(_id,JObject(List(JField($oid,JString(4ca63596ae65a71dd376938e))))), JField(foo,JString(bar)), JField(size,JInt(5))))
</code>我期望记录(“foo”)返回"bar“
我注意到一个值函数,它打印出一个地图,但实际的对象是一个JValue.this.Values?
scala> record.values res43: record.Values = Map((_id,Map($oid -> 4ca63596ae65a71dd376938e)), (foo,bar), (size,5))
scala> record.values("foo") :12: error: record.values of type record.Values does not take parameters record.values("foo")
有一些lift-json库提取case类的示例,但在本例中,我事先并不知道json模式。
发布于 2010-10-02 05:10:41
如果您查看实现,您将看到
case class JObject(obj: List[JField]) extends JValue {
type Values = Map[String, Any]
def values = Map() ++ obj.map(_.values.asInstanceOf[(String, Any)]) // FIXME compiler fails if cast is removed
}因此,这应该是可行的:
record.values.asInstanceOf[Map[String, Any]]("foo")您也可以尝试
record.values.apply("foo")发布于 2010-10-02 05:21:18
JValue.Values是路径相关的类型。这意味着如果你持有一个JString,它将是一个字符串,或者如果你拥有一个JArray,它将是一个ListAny。如果您确定解析的JSON是一个JSON对象,则可以将其转换为适当的类型。
val record = JsonParser.parse(json).asInstanceOf[JObject]JObject的路径相关类型是MapString、Any,因此:
scala> record.values("foo")
res0: Any = bar出于好奇心,如果您不知道要解析的数据的形状,是不是有点问题?
注意,如果您的数据包含(名称、描述、年龄),并且年龄是可选的,则可以将该JSON读入:
case class Person(name: String, description: String, age: Option[Int])https://stackoverflow.com/questions/3843000
复制相似问题