簡體   English   中英

如何為 Collection Map 編寫 codec 編解碼器

[英]How to write scodec codec for Collection Map

我有以下案例類

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]

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM