【问题标题】:get all keys of play.api.libs.json.JsValue获取 play.api.libs.json.JsValue 的所有键
【发布时间】:2014-12-26 08:06:53
【问题描述】:

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

【问题讨论】:

  • 你的意思是所有 json 对象中的所有键,即使在嵌套对象中?

标签: json scala collections playframework playframework-json


【解决方案1】:

如果你想获取 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 中的valuesMap,因此不会保留该顺序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2011-05-22
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多