2014-10-30 80 views
3

我必須將play.api.libs.json.JsValue密鑰存儲到列表中。我如何做到這一點?獲取play.api.libs.json.JsValue的所有密鑰

var str = ???      //json String 
val json: JsValue = Json.parse(str) 
val data=json.\("data") 
println(data)      //[{"3":"4"},{"5":"2"},{"4":"5"},{"2":"3"}] 
val newIndexes=List[Long]() 

期待

newIndexes=List(3,5,4,2) 
+0

你是指所有json對象中的所有鍵,即使在嵌套的對象中? – 2014-10-30 13:31:46

回答

4

如果你想獲得在JSON所有的鍵,你可以用

def allKeys(json: JsValue): collection.Set[String] = json match { 
    case o: JsObject => o.keys ++ o.values.flatMap(allKeys) 
    case JsArray(as) => as.flatMap(allKeys).toSet 
    case _ => Set() 
} 

注意,在JsObject是爲了不保留作爲values做遞歸一個Map

另一種選擇是使用領域的SeqJsObject,而不是使用keys

def allKeys(json: JsValue): Seq[String] = json match { 
    case JsObject(fields) => fields.map(_._1) ++ fields.map(_._2).flatMap(allKeys) 
    case JsArray(as) => as.flatMap(allKeys) 
    case _ => Seq.empty[String] 
} 

這樣你會得到JSON對象的所有密鑰的廣度優先的順序。

相關問題