Giter Club home page Giter Club logo

scalapb-circe's Introduction

scalapb-circe

scaladoc The structure of this project is hugely inspired by scalapb-json4s

Dependency

Include in your build.sbt file

core

libraryDependencies += "io.github.scalapb-json" %% "scalapb-circe" % "0.15.1"

for scala-js or scala-native

libraryDependencies += "io.github.scalapb-json" %%% "scalapb-circe" % "0.15.1"

macros

libraryDependencies += "io.github.scalapb-json" %% "scalapb-circe-macros" % "0.15.1"

Usage

JsonFormat

There are four functions you can use directly to serialize/deserialize your messages:

JsonFormat.toJsonString(msg) // returns String
JsonFormat.toJson(msg) // returns Json

JsonFormat.fromJsonString(str) // return MessageType
JsonFormat.fromJson(json) // return MessageType

Implicit Circe Codecs

You can also import codecs to support Circe's implicit syntax for objects of type GeneratedMessage and GeneratedEnum.

Assume a proto message:

message Guitar {
  int32 number_of_strings = 1;
}
import io.circe.syntax._
import io.circe.parser._
import scalapb_circe.codec._

Guitar(42).asJson.noSpaces // returns {"numberOfStrings":42}

decode[Guitar]("""{"numberOfStrings": 42}""") // returns Right(Guitar(42))
Json.obj("numberOfStrings" -> Json.fromInt(42)).as[Guitar] // returns Right(Guitar(42))

You can define an implicit scalapb_circe.Printer and/or scalapb_circe.Parser to control printing and parsing settings. For example, to include default values in Json:

import io.circe.syntax._
import io.circe.parser._
import scalapb_circe.codec._
import scalapb_circe.Printer

implicit val p: Printer = new Printer(includingDefaultValueFields = true)

Guitar(0).asJson.noSpaces // returns {"numberOfStrings": 0}

Finally, you can include scalapb GeneratedMessage and GeneratedEnums in regular case classes with semi-auto derivation:

import io.circe.generic.semiauto._
import io.circe.syntax._
import io.circe._
import scalapb_circe.codec._ // IntelliJ might say this is unused.

case class Band(guitars: Seq[Guitar])
object Band {
  implicit val dec: Decoder[Band] = deriveDecoder[Band]
  implicit val enc: Encoder[Band] = deriveEncoder[Band]
}
Band(Seq(Guitar(42))).asJson.noSpaces // returns {"guitars":[{"numberOfStrings":42}]}

Credits

scalapb-circe's People

Contributors

alexklibisz avatar dependabot[bot] avatar ghostdogpr avatar kostadinalmishev avatar scala-steward-bot avatar showmant avatar sideeffffect avatar viktortnk avatar xuwei-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

scalapb-circe's Issues

Allow for supplying custom encoders to ScalaPB ones

For example, the API I'm using requires me to send Map[String, A] as {"key": $string, "value": $a} and not {$string: $a}. I've created a custom Map[String, A: Encoder] to do this but it isn't picked up by scalapb-circe.

Deserializing Array field throws exceptions

message EcpmA {
  required string dummy = 1;
}
message EcpmR {
    required string meta = 1;
    repeated EcpmRequestAdvertiserMessage checks = 2 [(scalapb.field).collection_type="Array"];
}
    import scalapb_circe.json._
    val er = EcpmR(meta, Array(EcpmA("something")))
    println(s"${er.asJson}")

scalapb version=0.10.0
scalapb_circe version = 0.7.1

Exception

[E] Exception in thread "main" scalapb_json.JsonFormatException: [Lcom.chartboost.adrel.models.messages.InterfaceMessages.EcpmRequestAdvertiserMessage;@4218d6a3
[E]     at scalapb_circe.Printer.serializeMessageField(JsonFormat.scala:117)
[E]     at scalapb_circe.Printer.$anonfun$toJson$1(JsonFormat.scala:159)
[E]     at scala.collection.Iterator.foreach(Iterator.scala:943)
[E]     at scala.collection.Iterator.foreach$(Iterator.scala:943)
[E]     at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
[E]     at scala.collection.IterableLike.foreach(IterableLike.scala:74)
[E]     at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
[E]     at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
[E]     at scalapb_circe.Printer.toJson(JsonFormat.scala:156)
[E]     at scalapb_circe.JsonFormat$.$anonfun$protoToEncoder$1(JsonFormat.scala:460)
[E]     at io.circe.Encoder$$anon$3.apply(Encoder.scala:127)
[E]     at io.circe.syntax.package$EncoderOps$.asJson$extension(package.scala:10)
[E]     at com.chartboost.adrel.serving.Main$.main(Main.scala:1020)
[E]     at com.chartboost.adrel.serving.Main.main(Main.scala)

support scalapb 0.10.X line

scalapb has been moving toward 0.10.X for a while now, it would be great if scalapb-circe also published milestone releases along the way.

Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.