8

我必须将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)
4

1 回答 1

7

如果你想获取 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()
}

请注意,订单不会像valuesin一样JsObject被保留Map

另一种选择是使用Seqof 字段JsObject而不是使用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 对象中所有键的广度优先顺序。

于 2014-10-30T13:57:37.420 回答