【问题标题】:Play-json: Error on updating an object attribute inside an arrayPlay-json:更新数组内的对象属性时出错
【发布时间】:2015-08-09 20:37:57
【问题描述】:

我正在使用 play-json 库来操作我的 json 文件。我已经关注了official document,一切正常,但他们没有告诉我们何时要更新数组中对象的值,所以我正在尝试我自己的示例。

[
  {
    "key1": [
      {
        "key12": [
          {
            "key121": "text1",
            "key122": 121212,
            "key123": "text2",
            "key124": []
          }
        ],
        "key13": 0
      }
    ],
    "key2": "value2"
  }
]

在上面的示例中,我试图更新“key123”的值,但一次又一次地收到此错误,只是无法找出我在哪里做错了:(

线程“main”中的异常 java.util.NoSuchElementException: JsError.get 在 play.api.libs.json.JsError.get(JsResult.scala:14) 在 play.api.libs.json.JsError.get(JsResult.scala:13) 在 Refactor.authPage(Refactor.scala:73) 在 Builder$.main(Builder.scala:36) 在 Builder.main(Builder.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:483) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

这是我的代码。任何形式的帮助将不胜感激。

val transform = (((__ (0) \ 'key1)(0) \ 'key12)(0) \ 'key123).json.update(__.read[JsString].map(x => JsString("updated")))

val jsValue = Json.parse("example.json").transform(transform).get

【问题讨论】:

  • Json.parse("example.json").transform 返回一个 JsResult。您可以对 JsSuccessJsError 进行模式匹配。在您的情况下,您会得到 JsError。将其记录在模式匹配中将为您提供有关错误的更多上下文
  • 这是我的 JsError:{"obj":[{"msg":"error.expected.jsobject","args":[]}]}

标签: json scala playframework play-json


【解决方案1】:

我在网上做了一些研究,发现这个问题已经在 play mailing list 上讨论过,甚至有一个ticket 来解决这个问题。 play-json 不支持更新数组内的值(您可以这样做,但需要大量的工作,您需要更新完整的 JsArray)。

然而 play-json 目前不支持基于数组索引的转换,但有一个辅助库 play-json-zipper,它支持所有这些功能以及更多功能。 Play 开发者已关闭上述票证,假设人们可以在需要时使用play-json-zipper

P.S:添加我自己的答案,这样如果其他人通过谷歌搜索登陆这里,他们可以轻松找到解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2023-03-18
    • 2016-03-31
    • 1970-01-01
    • 2023-02-07
    • 2019-04-28
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多