doilux’s tech blog

ITに関する備忘録。 DDP : http://doiluxng.hatenablog.com/entry/2018/01/01/195409

ScalaでprotoをJSONにする

そもそもなんでわざわざprotoをJSONにしているのかというと

  1. 重いバッチがあって、その中で一部の処理が重い
  2. 「一部の処理」を別バッチに切り出して並列処理をする
  3. 元のバッチのジョブと切り出したバッチのジョブの間でオブジェクトをやりとりしたい =>JSONシリアライズしてデータストアに保存
  4. ↑のシリアライズのためのクラスを作る
  5. ↑をprotoにしておけば、もし将来、別のマイクロサービスとかに切り出した場合もすぐに対応できるじゃん

っていう経緯です。

依存ライブラリにscalaPBのscalapb-json4sを追加する。 scalapb.github.io

libraryDependencies += "com.thesamet.scalapb" %% "scalapb-json4s" % "0.7.0"

サンプル

message ProtoJsonTest {
    string a = 1;
    int64 b = 2;
    repeated string c = 3;
    repeated ProtoJsonTestSub sub = 4;
}


message ProtoJsonTestSub {
    string x = 1;
}

JSONシリアライズ、デシリアライズ

object Proto2JsonTest extends App {

  val proto = ProtoJsonTest(
    "hoge",
    1L,
    Seq("aaa", "bbbb"),
    Seq(ProtoJsonTestSub("ham"), ProtoJsonTestSub("egg"))
  )

  val r: String = JsonFormat.toJsonString(proto)
  println(r) // {"a":"hoge","b":"1","c":["aaa","bbbb"],"sub":[{"x":"ham"},{"x":"egg"}]}

  val desProto = JsonFormat.fromJsonString[ProtoJsonTest](r)
  println(proto == desProto) // true
}