3

この例があると、

import io.circe.generic.auto._
import io.circe.shapes._
import io.circe.parser._
import io.circe.syntax._
import shapeless._

case class A[T <: HList](name: String, params: T)

このケース クラスを空でない HList でインスタンス化すると、問題はありません。

scala> A("name", "a" :: HNil).asJson
res1: io.circe.Json =
{
  "name" : "name",
  "params" : [
    "a"
  ]
}

しかし、この HList が HNil のみの場合、次のエラーが発生します。

scala> A("name", HNil).asJson
<console>:29: error: could not find implicit value for parameter encoder: io.circe.Encoder[A[shapeless.HNil.type]]
   A("name", HNil).asJson
                   ^

ケースオブジェクトエンコーダーについて話しているこの質問を読みましたが、HNil (HNil はケースオブジェクト) では機能せず、ドキュメントでそれについて何かを見ました。参考までに、circe 0.6.1 を使用しています。

何か案が?

4

2 に答える 2

4

これは、 の静的型HNilが よりも具体的であるHNil(つまり、 であるHNil.type) ためです。以下は期待どおりに機能します。

scala> A("name", HNil: HNil).asJson.noSpaces
res0: String = {"name":"name","params":{}}

とのインスタンスを提供することもできますが、一般にとの静的型を使用して型を構築する場合、物事を単純にするために、 のみにインスタンスを提供することにします。EncoderDecoderHNil.typeHNil::HNilHNilHNil

この問題は、Shapeless 自体を含む他の場所で発生し、検索するとHNil: HNil30 回のオカレンスが返されます。

于 2017-01-12T16:13:28.273 に答える
2

Travis の答えは有効ですHNil。型注釈を使用して確実にエンコードできます。私は十分な評判を持っていないので、彼の答えにコメントすることはできませんが、空でないHLists は JSON 配列としてHlistエンコードされ、空は空の JSON オブジェクトとしてエンコードされることに気付きました。

この動作の簡単なコード サンプルを次に示します。

@ (1 :: 2 :: "foo" :: HNil).asJson.noSpaces 
res1: String = """[1,2,"foo"]"""
@ (HNil: HNil).asJson.noSpaces 
res12: String = "{}"
于 2017-01-12T16:35:51.647 に答える