scala 播放框架json查找内部数组

ebdffaop  于 2023-01-20  发布在  Scala
关注(0)|答案(1)|浏览(138)

我有简单的json:

{
  "name": "John",
  "placesVisited": [
    {
      "name": "Paris",
      "data": {
        "weather": "warm",
        "date": "31/01/22"
      }
    },
    {
      "name": "New York",
      "data": [
        {
          "weather": "warm",
          "date": "31/01/21"
        },
        {
          "weather": "cold",
          "date": "28/01/21"
        }
      ]
    }
  ]
}

正如你在这个json中看到的,有一个placesVisited字段,如果name是“纽约”,那么“数据”字段就是一个List,如果name是“巴黎”,那么它就是一个对象。
我想做的是把placesVisited对象拉出来,其中“name”:“纽约”,然后我将它解析为一个case类,我不能对placesVisited中的两个对象使用这个case类,因为它们对同一个名称有不同的类型。
所以我的想法是这样的:
在这里我需要添加一些东西来给予我一个name为“纽约”的元素,我该怎么做呢?
我的结果应该是这样的:

{
  "name": "New York",
  "data": [
    {
      "weather": "warm",
      "date": "31/01/21"
    },
    {
      "weather": "cold",
      "date": "28/01/21"
    }
  ]
}

这样的事情可能会发生,但它的可怕哈哈:

(Json.parse(myjson) \ "placesVisited").as[List[JsObject]].find(item => {
  item.value.get("name").toString.contains("New York")
}).getOrElse(throw Exception("could not find New York element")).as[NewYorkModel]
luaexgnf

luaexgnf1#

item.value.get("name").toString可以稍微简化为(item \ "name").as[String],但除此之外没有太多改进。
另一种选择是使用case class Place(name: String, data: JsValue)并按如下方式执行操作:

(Json.parse(myjson) \ "placesVisited")
  .as[List[Place]]
  .find(_.name == "New York")

相关问题