有了这个例子,
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 实例化这个 case 类时,没有问题:
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
^
我读过这个 question 他们谈论案例对象编码器,但它不适用于 HNil(HNil 是案例对象),我在文档中看到了有关它的任何内容。仅供引用,我正在使用大约 0.6.1
任何想法?
最佳答案
这是因为 HNil
的静态类型比 HNil
更具体(即它是 HNil.type
)。以下将按预期工作:
scala> A("name", HNil: HNil).asJson.noSpaces
res0: String = {"name":"name","params":{}}
我们可以为
Encoder
提供 Decoder
和 HNil.type
实例,但一般来说,当你用 HNil
和 ::
构造一个类型时, HNil
的静态类型是 HNil
,为了简单起见,我们决定只为 HNil
提供实例。这个问题出现在其他地方,包括在 Shapeless 本身中,搜索
HNil: HNil
会返回三十多处出现。关于scala - 当 HList 参数为 HNil 时如何编码 Json?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41617780/