0
votes

I have a very large file of json lines, which I intend to read into a list of case classes. Due to the size of the file, rather than reading the entire file into a variable first and then filtering, I would like to filter within the json decoding pattern matching. Currently the code looks like this:

import io.circe.Decoder
import io.circe.generic.semiauto.deriveDecoder
import io.circe.parser.decode

case class Person(name: String, age: Int, country: String)

val personList: List[Person] =
    Source.fromResource("Persons.json").getLines.toList.map { line =>
      implicit val jsonDecoder: Decoder[Person] = deriveDecoder[Person]
      val decoded = decode[Person](line)
      decoded match {
        case Right(decodedJson) =>
          Person(
            decodedJson.name,
            decodedJson.age,
            decodedJson.country
          )
        case Left(ex) => throw new RuntimeException(ex)
      }
    }

however, if I wanted to only include Person instances with a country of "us", what would be the best way to accomplish this? Should I have nested pattern matching, that will specifically look for Person(_, _, "us") (im not sure how I would accomplish this), or is there some way I can implement Option handling?

I would stream in this case to achieve both goals. And also, no need to instantiate a Decoder[Person each line, just put a single instance above the expression. - AminMal