1

我有以下案例类

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]吗?

4

1 回答 1

3

您需要做的是为Codec字符串的元组定义,然后您需要使用它来创建List[(String, String)]可以转换为的编解码器Map[String, String],反之亦然,因此隐蔽Codec使用xmap函数。

所以最终的解决方案可能如下所示:

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]

希望这可以帮助!

于 2020-03-23T19:28:04.240 回答