簡體   English   中英

我可以使用Scala lift-json庫將JSON解析為Map嗎?

[英]Can I use the Scala lift-json library to parse a JSON into a Map?

有沒有辦法使用lift-json庫的JObject類來表現得像Map?

例如:

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”

我注意到一個值函數,它打印出一個Map,但實際的對象是一個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模式。

如果你看一下實現,你會看到

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

JValue.Values是一種路徑依賴類型。 這意味着如果你持有JString它將是一個String,或者如果你有一個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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM