Bson Codecs
Introduction​
BSON (Binary JSON) is a binary serialization format used to store and exchange data efficiently. In this article, we will explore how to derive BSON codecs from a ZIO Schema. The zio-schema-bson
module, provides support for deriving codecs from ZIO Schema, and makes it easy to communicate data in BSON format.
Installation​
To use BSON codecs, you need to add the following dependency to your Scala project:
libraryDependencies += "dev.zio" %% "zio-schema-bson" % 1.5.0
BsonSchemaCodec​
The BsonSchemaCodec
object inside the zio.schema.codec
package provides the bsonCodec
operator which allows us to derive Protobuf codecs from a ZIO Schema:
object BsonSchemaCodec {
def bsonCodec[A](schema: Schema[A]): BsonCodec[A]
}
Example​
Let's see an example of how to derive a BSON codec for a case class using ZIO Schema:
import org.bson.BsonValue
import zio._
import zio.bson._
import zio.schema.codec._
import zio.schema.{DeriveSchema, Schema}
case class Person(name: String, age: Int)
object Person {
implicit val schema: Schema[Person] = DeriveSchema.gen
implicit val bsonCodec: BsonCodec[Person] =
BsonSchemaCodec.bsonCodec(Person.schema)
}
object Main extends ZIOAppDefault {
def run = for {
_ <- ZIO.debug("Bson Example:")
person: Person = Person("John", 42)
encoded: BsonValue = person.toBsonValue
_ <- ZIO.debug(s"person object encoded to BsonValue: $encoded")
decoded <- ZIO.fromEither(encoded.as[Person])
_ <- ZIO.debug(s"BsonValue of person object decoded to Person: $decoded")
} yield ()
}
In the example above, we defined a case class Person
with fields name
and age
. We then derived a ZIO Schema for the Person
case class using DeriveSchema.gen
.
The BsonSchemaCodec.bsonCodec
method allowed us to create a BSON codec for the Person
case class by passing its corresponding ZIO Schema. Now, we can effortlessly encode Person
objects to BSON and decode BSON values back to Person instances.