如何为Collection Map编写scodec编解码器
How to write scodec codec for Collection Map
我有以下情况class
case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)
下面是我到目前为止尝试过的代码 -
import scodec._
import scodec.codecs._
implicit val mapCodec: Codec[List[(String, String)]] = sizedList()
implicit val fooCodec : Codec[Foo] = {
("code" | int32) :: ("msg" | cstring) :: ("headers" | mapCodec)
}.as[Foo]
我不知道如何为 Map[String, String]
编写编解码器。我查看了在线文档,但它仍在 TODO 中。
知道如何为 Map[String, String]
编写编解码器吗?
你需要做的是为字符串元组定义 Codec
,然后你需要使用它来为 List[(String, String)]
创建编解码器,它可以转换为 Map[String, String]
反之亦然,因此使用 xmap
函数隐藏 Codec
。
所以最终的解决方案可能是这样的:
import scodec._
import scodec.codecs._
case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)
implicit val tupleCodec : Codec[(String, String)] = cstring.pairedWith(cstring)
implicit val mapCodec: Codec[Map[String, String]] = list(tupleCodec).xmap(_.toMap, _.toList)
implicit val fooCodec : Codec[Foo] = {
("code" | int32) :: ("msg" | cstring) :: ("headers" | mapCodec)
}.as[Foo]
希望对您有所帮助!
我有以下情况class
case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)
下面是我到目前为止尝试过的代码 -
import scodec._
import scodec.codecs._
implicit val mapCodec: Codec[List[(String, String)]] = sizedList()
implicit val fooCodec : Codec[Foo] = {
("code" | int32) :: ("msg" | cstring) :: ("headers" | mapCodec)
}.as[Foo]
我不知道如何为 Map[String, String]
编写编解码器。我查看了在线文档,但它仍在 TODO 中。
知道如何为 Map[String, String]
编写编解码器吗?
你需要做的是为字符串元组定义 Codec
,然后你需要使用它来为 List[(String, String)]
创建编解码器,它可以转换为 Map[String, String]
反之亦然,因此使用 xmap
函数隐藏 Codec
。
所以最终的解决方案可能是这样的:
import scodec._
import scodec.codecs._
case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)
implicit val tupleCodec : Codec[(String, String)] = cstring.pairedWith(cstring)
implicit val mapCodec: Codec[Map[String, String]] = list(tupleCodec).xmap(_.toMap, _.toList)
implicit val fooCodec : Codec[Foo] = {
("code" | int32) :: ("msg" | cstring) :: ("headers" | mapCodec)
}.as[Foo]
希望对您有所帮助!