【问题标题】:Manipulating array in JSON using Scala and JSON4S使用 Scala 和 JSON4S 在 JSON 中操作数组
【发布时间】:2017-05-31 08:30:11
【问题描述】:

我正在尝试使用 Json4s 在 Scala 中操作 JSON 对象。

假设我的 JSON 如下所示:

{
  "data": {
    "plan": {
      "itineraries": [
       {
         "startTime": 1494933289000,
         "duration": 2174
       },
       {
         "startTime": 2494933289000,
         "duration": 3174
       }
     ]
    }
  }
}

假设我想为每个行程添加一个字段 - 就像这样:

{
  "data": {
    "plan": {
      "itineraries": [
       {
         "startTime": 1494933289000,
         "duration": 2174,
         "id": "1"
       },
       {
         "startTime": 2494933289000,
         "duration": 3174,
         "id": "2"
       }
     ]
    }
  }
}

我该怎么做?

【问题讨论】:

  • 也许你可以在stackoverflow.com/a/21469460/5160111找到答案
  • 这不是一回事:-/我正在尝试为数组中的每个元素添加一个唯一值。该示例只是将一个节点添加到另一个节点

标签: scala json4s


【解决方案1】:

有读者案例类:ItineraryReads(startTime, duration)

作家案例类:ItineraryWrites(startTime, duration, id)

def mapToWrites(obj : List[ItineraryReads]) = {

obj.map(o => ItineraryWrites(o.startTime, o.duration, (obj.indexOf(o)) + 1))

}

这应该可行。把它写成一个 ItineraryWrites 列表:)

【讨论】:

  • 你可能会喜欢obj.zipWithIndex.map { case (itinerary, index) => ..}
【解决方案2】:

transformField 可以用merge 覆盖这种情况:

  val t = parse(s).transformField {
    case JField("itineraries", JArray(arr)) => // pattern match in there, more type safe
      val r = arr.zipWithIndex.map(f => f._1 merge JObject("id" -> JInt(f._2 + 1)))
      ("itineraries", r)
  }
  println(compact(render(t)))
  > {"data":{"plan":{"itineraries":[{"startTime":1494933289000,"duration":2174,"id":1},{"startTime":2494933289000,"duration":3174,"id":2}]}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2015-03-11
    • 2020-08-20
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多