0

我正在尝试使用 arity 23 实现 CodecJson。它看起来像这样:

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 - 等等所有其他字段/类型?

谢谢!

4

1 回答 1

0

编辑: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”(("value" := c.value)
  3. 添加一个值为“c.name”的键“name”(("name" := c.name)

:=构造一个 JSON 键值对。

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

于 2020-09-15T13:24:54.887 回答