我可以使用Scala lift json库将json解析为映射吗?

我可以使用Scala lift json库将json解析为映射吗?,json,scala,lift,Json,Scala,Lift,有没有一种方法可以使用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(L

有没有一种方法可以使用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”

我注意到一个values函数,它打印出一张地图,但实际对象是一个JValue.this.values


scala>record.values
res43:record.Values=Map(_id,Map($oid->4ca63596ae65a71dd376938e)),(foo,bar),(size,5))

scala>record.values(“foo”) :12:错误:record.Value类型为record。值不采用参数 记录值(“foo”)


lift json库提取case类的例子也有,但在本例中,我并不预先知道json模式。

如果您查看实现,您将看到

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")

Values是一种依赖于路径的类型。这意味着,如果您按住一个JString,它将是一个字符串,或者如果您得到一个JArray,它将是一个列表[任何]。如果确定所解析的JSON是JSON对象,则可以将其转换为适当的类型

val record = JsonParser.parse(json).asInstanceOf[JObject]
JObject的路径依赖类型是Map[String,Any],因此:

scala> record.values("foo")                                     
res0: Any = bar
出于好奇,如果您不知道要解析的数据的形状,这不是有点问题吗

注意,如果您的数据包含(名称、描述、年龄),并且年龄是可选的,那么您可以将该JSON读入:

case class Person(name: String, description: String, age: Option[Int])

谢谢,第一个选项有效,使用apply()的第二个选项返回一个错误。我最后使用了scala的内置java解析器。parseFull(记录)将返回一个Some(映射)或Some(列表)。我有一个json,它有一个不同字段的数组。例如,第一个文档可能有(名称、说明、年龄),但第二个文档可能只指定了(名称、年龄)。如果我使用scala的Map对象,我可以调用document.getOrElse(“foo”),这是将Map解析为case类中的参数的相关答案