【问题标题】:How to update a nested json using scala play framework?如何使用 scala 播放框架更新嵌套的 json?
【发布时间】:2020-10-09 13:05:29
【问题描述】:

我正在尝试使用 Scala 播放框架更新 json 中存在的 json 值。而不是更新值,而是附加值。

val newJsonString = """{"P123": 25}"""
val jsonStringAsJsValue = Json.parse("""{"counter_holders": {"Peter": 25}}""")
//jsonStringAsJsValue: play.api.libs.json.JsValue = {"counter_holders":{"Peter":25}}

val jsonTransformer = (__ \"counter_holders" ).json.update(__.read[JsValue].map{o => Json.parse(newJsonString)})

jsonStringAsJsValue.transform(jsonTransformer).get.as[JsValue]
//Now getting this jsvalue
//play.api.libs.json.JsValue = {"counter_holders":{"Peter":25,"P123":25}}
//But need  this jsvalue
//play.api.libs.json.JsValue = {"counter_holders":{"P123":25}}

对此的任何帮助都会非常好。

【问题讨论】:

    标签: scala play-json


    【解决方案1】:

    引用update 方法文档:

    (__\'key).json.update(reads) 是最复杂的Reads[JsObject] 但最强大的:

    • 复制整个 JsValue => A

    • 将传递的 Reads[A] 应用于 JsValue => B

    • deep 合并了两个 JsValues (A ++ B) 所以 B 覆盖了 A 相同的分支请注意,如果你在 B 中修剪了一个分支,它仍然是 在 A 中,您将在结果示例中看到它:

      {{{ val js = Json.obj("key1" -> "value1", "key2" -> "value2")
      js.validate(__.json.update((__ \ 'key3).json.put(JsString("value3"))))
      => JsSuccess({"key1":"value1","key2":"value2","key3":"value3"},) }}}
      

    因此,您看到的行为符合预期。如果您想采用这种方法,即使用路径进行更新,您可以使用方法prune。例如你可以这样做:

    val newJsonString = """{"P123": 25}"""
    val jsonStringAsJsValue = Json.parse("""{"counter_holders": {"Peter": 25}}""")
    //jsonStringAsJsValue: play.api.libs.json.JsValue = {"counter_holders":{"Peter":25}}
    
    val jsonTransformer = (__ \"counter_holders" ).json
      .update(__.read[JsValue].map{o => Json.parse(newJsonString)})
    
    val jsonTransformerDelete = (__ \"counter_holders" \ "Peter" ).json.prune
    
    jsonStringAsJsValue.transform(jsonTransformer).flatMap(_.transform(jsonTransformerDelete)) match {
      case JsSuccess(value, _) =>
        println(value)
      case JsError(errors) =>
        println(errors)
    }
    

    这将产生想要的行为。你可以在scastie找到它。

    【讨论】:

      猜你喜欢
      • 2013-07-11
      • 2021-08-05
      • 2014-07-29
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2015-08-03
      • 2013-09-22
      • 2015-06-09
      相关资源
      最近更新 更多