Question

I want to extract using LiftJson or Json4s the following Json (not quite but something similar) to the following case classes.

{
  "data": [
    {
    "id": "1234",
    "message": "Test",
    "comments": {
      "data": [
        {
          "id": "4321",
          "content": "Test2",
        }
      ]
    }
}

The case classes:

case class A(id: String, message: string, comments: List[B])
case class B(id: String, content: String)

For the top level I can do: (val \ "data").extract[List[A]] to flatten the extra data field. But for the second level one, I don't see I way to use extract DIRECTLY.

Could I use a custom serializer (exemple here) or any of the following function (json4s) to remove the extraneous "data" field? Or any idea to make it simple?

def mapField(f: JField => JField): JValue
def transformField(f: PartialFunction[JField, JField]): JValue

Want I want to avoid is creating others intermidiate case class to extract the data, and then create the shown case class with it.

Was it helpful?

Solution

I found the solution a while ago, but haven't had time to reply. I was thinking backward, this is easy:

def transformListData(src: JValue, field: String): JValue = {
  src.transformField {
    case JField(x, v) if x == field => JField(field, v \ "data")
  }
}

transformListData(json, "comments")

The following would remove the extra data and would flatten the list.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top