将 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)
)
->:
意味着“前置”,这意味着您必须从右到左阅读一连串的 ->:
调用。关于上面的例子:
- 从空对象开始 (
jEmptyObject
)
- 添加值为“c.value”的键“值”(
("value" := c.value)
)
- 添加值为“c.name”的键“name”(
("name" := c.name)
)
:=
构造一个 JSON key-value 对。
我认为你的解码部分(CodecJson.apply()
的第二个参数)应该按预期工作。
我正在尝试使用 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)
)
->:
意味着“前置”,这意味着您必须从右到左阅读一连串的 ->:
调用。关于上面的例子:
- 从空对象开始 (
jEmptyObject
) - 添加值为“c.value”的键“值”(
("value" := c.value)
) - 添加值为“c.name”的键“name”(
("name" := c.name)
)
:=
构造一个 JSON key-value 对。
我认为你的解码部分(CodecJson.apply()
的第二个参数)应该按预期工作。