2014-10-30 82 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对象的所有密钥的广度优先的顺序。

相关问题