jsonscalaparsingjson4s

Scala parsing nested json with Json4s


I am trying to fetch data from nested JSON, I need only a few fields from the JSON, I have created case classes for the required data, the solution I found from google suggested to use read function, but I get an empty Object I tried to google with no success, What I am missing? my code

val rawDataFromFile = Source.fromFile(path).mkString

case class Data(listOfPersons: List[Person])

case class Person(bio: Bio, terms: List[Term])

case class Bio(birthday: String, gender: String)

case class Term(`type`: String, start: String, end: String)

read[Data](rawDataFromFile)

res >> Data(List())

and the JSON

[
  {
    "id": {
      "not_intresting_field_1": "B000944",
      "not_intresting_field_4": [
        "H2OH13033",
        "S6OH00163"
      ]
    },
    "name": {
      "first": "first_name_1",
      "last": "last_name_1"
    },
    "bio": {
      "birthday": "1952-11-09",
      "gender": "M"
    },
    "terms": [
      {
        "type": "rep",
        "start": "1993-01-05",
        "end": "1995-01-03"
      },
      {
        "type": "rep",
        "start": "1995-01-04",
        "end": "1997-01-03"
      }
    ]
  },
  {
    "id": {
      "not_intresting_field_1": "C000127",
      "not_intresting_field_4": [
        "S8WA00194",
        "H2WA01054"
      ]
    },
    "name": {
      "first": "first_name_1",
      "last": "last_name_1"
    },
    "bio": {
      "birthday": "1958-10-13",
      "gender": "F"
    },
    "terms": [
      {
        "type": "rep",
        "start": "1993-01-05",
        "end": "1995-01-03"
      },
      {
        "type": "sen",
        "start": "2001-01-03",
        "end": "2007-01-03"
      }
    ]
  }
]

Solution

  • Your case class is not the same as your json structure.

    Here your define Data type which will read json like following

    {
      "listOfPersons": [
      {
        "id": {
          "not_intresting_field_1": "B000944",
          "not_intresting_field_4": [
            "H2OH13033",
            "S6OH00163"
          ]
        },
        "name": {
          "first": "first_name_1",
          "last": "last_name_1"
        },
        "bio": {
          "birthday": "1952-11-09",
          "gender": "M"
        },
        ... //your original json
      }
    
      ]
    }
    

    Try this

    read[List[Person]](rawDataFromFile)