Search code examples
scalacirce

Filter resulting JSON using circe


I have a JSON object that I've transformed that I need to filter down to only a subset of its original keys. I've looked through the docs for the Json object in circe but it doesn't appear to expose any API around filtering the object. Do I have to use a cursor for this? I considered creating a decoder from a case class however my keys have a special character . in them. Here is some more code/data for context.

{
 "field.nested.this": "value",
 "field.nested.that": "value",
 "field.nested.where": "value"
}

What's the best approach to create a new JSON instance that doesn't contain the field.nested.that field?


Solution

  • I'm not sure if this is what you need:

    object Circe extends App {
      import io.circe._
      import io.circe.literal._
      import io.circe.syntax._
    
      //I'm using a json literal here.
      //If you have a runtime string from an external source
      // you would need to parse it with `io.circe.parser.parse` first
      val json: Json = json"""
        {
           "field.nested.this": "value",
           "field.nested.that": "value",
           "field.nested.where": "value"
        }
      """
    
      val maybeJsonFiltered =
        json.asObject.map(_.filterKeys(_ != "field.nested.that").asJson)
    
      println(maybeJsonFiltered)
      //  Some({
      //    "field.nested.this" : "value",
      //    "field.nested.where" : "value"
      //  })
    }
    

    Alternatively you could also parse it as a map (json.as[Map[String, String]]) or a custom case class with only the fields you need, and encode them back to json. You will probably need a @JsonKey annotation for all your fields with ..