将 Argonaut 元组数量提高到 23

Raising Argonaut tuple arity to 23

我正在尝试使用 arity 23 实现编解码器Json。它看起来像这样:

implicit def infoCodec: CodecJson[Info] = CodecJson(
    (x: Info) => argonaut.Json(
      "a" -> x.a,
      "b" -> x.b,
      "c" -> x.c,
      ...(a total of 23 fields)
    ),
cursor => for {
      a <- cursor.get("a")
      b <- cursor.get("b")
      c <- cursor.get("c")
      ...(a total of 23 fields)
    }
  )

但是,我在所有字段上都遇到类型错误,例如:

type mismatch;
  Id|Json
      "a" -> x.a,

如何将 x.a 转换为 Json - 其他所有 fields/types 依此类推?

谢谢!

编辑:Scala 函数的数量限制为 22。所以这可能只是你的问题。

您需要使用 Argonaut 提供的“方法”来构建 JSON::=->:。例如:

case class MyCookie(name: String, value: String)
implicit def myCookieCodec = CodecJson((c: MyCookie) =>
    ("name" := c.name) ->:
    ("value" := c.value) ->: 
    jEmptyObject,
    c => for {
        name <- (c --\ "name").as[String]
        value <- (c --\ "value").as[String]
    } yield Cookie(name, value)
)

->: 意味着“前置”,这意味着您必须从右到左阅读一连串的 ->: 调用。关于上面的例子:

  1. 从空对象开始 (jEmptyObject)
  2. 添加值为“c.value”的键“值”(("value" := c.value))
  3. 添加值为“c.name”的键“name”(("name" := c.name))

:= 构造一个 JSON key-value 对。

我认为你的解码部分(CodecJson.apply() 的第二个参数)应该按预期工作。