簡體   English   中英

播放框架 json 在數組中查找

[英]play framework json lookup inside array

我有簡單的 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 字段,如果名稱是“紐約”,則“數據”字段是一個列表,如果名稱是“巴黎”,則它是一個 object。

我想要做的是拉出 placesVisited object where "name": "New York" 然后我將它解析為一個案例 class 我有,我不能將這個案例 class 用於 placesVisited 中的兩個對象因為它們有差異類型相同的名稱。

所以我想做的是:

(myJson \ "placesVisited")並且在這里我需要添加一些東西來給我名稱為“New York”的元素,我該怎么做?

我的結果應該是這樣的:

{
  "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]

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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM