JSON Codecs
Circe
Platforms: JVM, JS, Native
libraryDependencies += "io.github.matejcerny" %% "pgmq4s-circe" % "0.8.0"
import io.circe.{Decoder, Encoder}
import pgmq4s.circe.given
case class OrderCreated(orderId: Long, email: String) derives Encoder.AsObject, Decoder
Jsoniter-scala
Platforms: JVM, JS, Native
libraryDependencies += "io.github.matejcerny" %% "pgmq4s-jsoniter" % "0.8.0"
import com.github.plokhotnyuk.jsoniter_scala.core.*
import com.github.plokhotnyuk.jsoniter_scala.macros.*
import pgmq4s.jsoniter.given
case class OrderCreated(orderId: Long, email: String)
given JsonValueCodec[OrderCreated] = JsonCodecMaker.make
uPickle
Platforms: JVM, JS, Native
libraryDependencies += "io.github.matejcerny" %% "pgmq4s-upickle" % "0.8.0"
import upickle.default.*
import pgmq4s.upickle.given
case class OrderCreated(orderId: Long, email: String) derives ReadWriter
Play JSON
Platforms: JVM only
libraryDependencies += "io.github.matejcerny" %% "pgmq4s-play-json" % "0.8.0"
import play.api.libs.json.*
import pgmq4s.playjson.given
case class OrderCreated(orderId: Long, email: String)
given Format[OrderCreated] = Json.format[OrderCreated]
Spray JSON
Platforms: JVM only
libraryDependencies += "io.github.matejcerny" %% "pgmq4s-spray-json" % "0.8.0"
import spray.json.*
import spray.json.DefaultJsonProtocol.*
import pgmq4s.sprayjson.given
case class OrderCreated(orderId: Long, email: String)
given RootJsonFormat[OrderCreated] = jsonFormat2(OrderCreated.apply)
Custom Codecs
If your JSON library isn't supported, implement PgmqEncoder and PgmqDecoder directly:
import pgmq4s.{PgmqEncoder, PgmqDecoder}
given PgmqEncoder[OrderCreated] = PgmqEncoder.instance: order =>
s"""{"orderId":${order.orderId},"email":"${order.email}"}"""
given PgmqDecoder[OrderCreated] = PgmqDecoder.instance: json =>
// parse json string into OrderCreated
Right(OrderCreated(1L, "parsed@example.com"))
Note
Built-in PgmqEncoder[String] and PgmqDecoder[String] instances are provided in core — useful for raw JSON strings or simple text payloads.
In this article
