【问题标题】:Can I use the Scala lift-json library to parse a JSON into a Map?我可以使用 Scala lift-json 库将 JSON 解析为 Map 吗?
【发布时间】:2010-10-01 20:56:47
【问题描述】:

有没有办法使用 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>

我本来希望 record("foo") 返回 "bar"

我注意到一个 values 函数,它打印出一个 Map 但实际对象是 JValue.this.Values?

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

scala> record.values("foo") :12: 错误:record.values 类型的record.Values 不带参数 记录值(“富”)

有一些使用 lift-json 库提取案例类的示例,但在这种情况下,我事先并不知道 json 架构。

【问题讨论】:

标签: json scala lift


【解决方案1】:

如果你看一下实现,你会看到

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

【讨论】:

  • 谢谢,第一个有效,使用 apply() 的第二个选项返回错误。我结束了使用 scala 的内置 java 解析器。 scala.util.parsing.json.JSON.parseFull(record) 将返回 Some(Map) 或 Some(List)
【解决方案2】:

JValue.Values 是一个依赖于路径的类型。这意味着如果你持有一个 JString,它将是一个字符串,或者如果你有一个 JArray,它将是一个 List[Any]。如果您确定您解析的 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])

【讨论】:

  • 我有一个包含不同字段数组的 json。例如。第一个文档可能有 (name, description, age) 但第二个文档可能只指定了 (name, age)。如果我使用 scala 的 Map 对象,我可以调用 document.getOrElse("foo", "")
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多