首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为集合地图编写codec编解码器

如何为集合地图编写codec编解码器
EN

Stack Overflow用户
提问于 2020-03-24 02:36:36
回答 1查看 88关注 0票数 1

我有下面的案例类

代码语言:javascript
复制
case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)

下面是我到目前为止已经尝试过的代码:

代码语言:javascript
复制
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]的编解码器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 03:28:04

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

因此,最终的解决方案可能如下所示:

代码语言:javascript
复制
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]

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60819654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档