簡體   English   中英

將 Argonaut 元組 arity 提高到 23

[英]Raising Argonaut tuple arity to 23

我正在嘗試實現一個 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,

如何將xa轉換為 Json - 等等所有其他字段/類型?

謝謝!

編輯: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) ) 的鍵 "value"
  3. 添加值為 "c.name" ( ("name" := c.name) ) 的鍵 "name"

:=構造一個 JSON 鍵值對。

我認為您的解碼部分( CodecJson.apply()的第二個參數)應該按預期工作。

暫無
暫無

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

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