![](/img/trans.png)
[英]Can't parse a json to a `ProvinceJson` class, with lift-json
[英]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.