HList参数为HNil时如何编码Json?
How to encode Json when HList parameter is HNil?
有了这个例子,
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 实例化这种情况 class 时,没有问题:
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
有什么想法吗?
这是因为 HNil
的静态类型比 HNil
更具体(即 HNil.type
)。以下将按预期工作:
scala> A("name", HNil: HNil).asJson.noSpaces
res0: String = {"name":"name","params":{}}
我们可以为HNil.type
提供Encoder
和Decoder
实例,但通常当您使用[=11=构建类型时] 和 ::
HNil
的静态类型是 HNil
,为了简单起见,我们决定只为 HNil
.
提供实例
这个问题出现在其他地方,包括 Shapeless 本身,在那里搜索 HNil: HNil
returns thirty-something 次。
Travis 的回答是有效的,您当然可以使用类型注释对 HNil
进行编码。我没有足够的声誉,所以我不能评论他的回答,但我注意到 non-empty HList
s 编码为 JSON 数组,而空的 Hlist
编码为一个空的 JSON 对象。
这是此行为的快速代码示例。
@ (1 :: 2 :: "foo" :: HNil).asJson.noSpaces
res1: String = """[1,2,"foo"]"""
@ (HNil: HNil).asJson.noSpaces
res12: String = "{}"
有了这个例子,
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 实例化这种情况 class 时,没有问题:
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
更具体(即 HNil.type
)。以下将按预期工作:
scala> A("name", HNil: HNil).asJson.noSpaces
res0: String = {"name":"name","params":{}}
我们可以为HNil.type
提供Encoder
和Decoder
实例,但通常当您使用[=11=构建类型时] 和 ::
HNil
的静态类型是 HNil
,为了简单起见,我们决定只为 HNil
.
这个问题出现在其他地方,包括 Shapeless 本身,在那里搜索 HNil: HNil
returns thirty-something 次。
Travis 的回答是有效的,您当然可以使用类型注释对 HNil
进行编码。我没有足够的声誉,所以我不能评论他的回答,但我注意到 non-empty HList
s 编码为 JSON 数组,而空的 Hlist
编码为一个空的 JSON 对象。
这是此行为的快速代码示例。
@ (1 :: 2 :: "foo" :: HNil).asJson.noSpaces
res1: String = """[1,2,"foo"]"""
@ (HNil: HNil).asJson.noSpaces
res12: String = "{}"