1
votes

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?

1

1 Answers

1
votes

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 ..