Home > Software engineering >  How to unmarshall json response removing unnecessary fields using Akka HTTP
How to unmarshall json response removing unnecessary fields using Akka HTTP

Time:12-05

I'm new to Akka HTTP and I want to get rid of unnecessary fields from a JSON response and take only the necessary fields. For example, I use enter image description here

CodePudding user response:

For parsing json you need to use some library. In akka-http docs they use spray-json. Add the following dependency to your build.sbt with appropriate akkaHttpVersion.

"com.typesafe.akka" %% "akka-http-spray-json" % akkaHttpVersion

Now you need serializers and deserializers for your data. I am using a simple model, change it as needed.

trait Formatter extends DefaultJsonProtocol {

  implicit object jsonFormat extends JsonFormat[Versions] {
    override def read(json: JsValue): Versions = json match {
      case JsObject(fields) =>
        Versions(fields.keys.toList)
    }

    override def write(obj: Versions): JsValue = JsonParser(obj.toString)
  }

  implicit val formatterPackage: RootJsonFormat[Package] = jsonFormat2(Package)

  case class Package(name: String, versions: Versions)

  case class Versions(versions: List[String])
}

Finally sink:

 //needed import with others
 import spray.json._

 object SoftwareRegistry extends App  with Formatter {

   //existing code
   //---------


   val sink = Sink.foreach[NPMPackage] { p =>
       // https request
       val responseFuture: Future[HttpResponse] =
         Http().singleRequest(HttpRequest(uri = s"https://registry.npmjs.org/${p.name}"))
       val packages = responseFuture
         .flatMap(
           _.entity
             .dataBytes
             .via(JsonFraming.objectScanner(Int.MaxValue))
             .map(_.utf8String)
             .map(_.parseJson.convertTo[Package])
             .toMat(Sink.seq)(Keep.right)
             .run()
         )

       packages.onComplete {
         case Success(res) => println(res)
         case Failure(_) => sys.error("Something went wrong")
       }
   }

   //existing code
   //---------
}
  • Related