Search code examples
scalacirce

How to ignore a field from serializing when using circe in scala


I am using circe in scala and have a following requirement :

Let's say I have some class like below and I want to avoid password field from being serialised then is there any way to let circe know that it should not serialise password field?

In other libraries we have annotations like @transient which prevent field from being serialised ,is there any such annotation in circe?

case class Employee(                   
                     name: String,
                     password: String)

Solution

  • You could make a custom encoder that redacts some fields:

    implicit val encodeEmployee: Encoder[Employee] = new Encoder[Employee] {
      final def apply(a: Employee): Json = Json.obj(
        ("name", Json.fromString(a.name)),
        ("password", Json.fromString("[REDACTED]")),
      )
    }
    

    LATER UPDATE

    In order to avoid going through all fields contramap from a semiauto/auto decoder:

    import io.circe.generic.semiauto._
    
    implicit val encodeEmployee: Encoder[Employee] =
      deriveEncoder[Employee]
        .contramap[Employee](unredacted => unredacted.copy(password = "[REDACTED]"))