2

I'm trying to manipulate a JSON object in Scala using Json4s.

Say my JSON looks like this:

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

Say I want to add a field to each itinerary - Like so:

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

How do I do that?

KimHafr
  • 2,922
  • 3
  • 26
  • 28

2 Answers2

4

Have reader case class : ItineraryReads(startTime, duration)

Writer case class : ItineraryWrites(startTime, duration, id)

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

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

}

This should work. Write it out as a list of ItineraryWrites :)

Sam Upra
  • 737
  • 5
  • 12
1

transformField can be used to cover this situation with 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}]}}}
chengpohi
  • 14,064
  • 1
  • 24
  • 42