scala - HList参数为HNil时如何对Json进行编码?

标签 scala shapeless circe

有了这个例子,

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
                   ^

我读过这个question他们在那里谈论案例对象编码器,但它不适用于 HNil(HNil 是案例对象),我在文档中看到过任何关于它的内容。仅供引用,我使用的是 circe 0.6.1

有什么想法吗?

最佳答案

这是因为 HNil 的静态类型比 HNil 更具体(即它是 HNil.type)。以下将按预期工作:

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

我们可以HNil.type 提供EncoderDecoder 实例,但通常当您构造一个HNil:: 的类型 HNil 的静态类型是 HNil,为了简单起见,我们决定仅为 HNil 提供实例。

这个问题出现在其他地方,包括 Shapeless 本身,搜索 HNil: HNil 会返回三十多条匹配项。

关于scala - HList参数为HNil时如何对Json进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41617780/

相关文章:

arrays - Scala Array.apply 的魔力是什么

ruby - 动态语言——我应该选择哪一种?

function - scala匿名函数问题

scala - 带标记类型的解码案例类

json - Circe DeriveDecoder/deriveEncoder 找不到 io.circe.generic.encoding.DerivedAsObjectEncoder 类型的惰性隐式值

json - 在 Scala 中使用选项 [ 或者 [A,B ] ] 解析 json 的替代方法

scala - 如何在 docker 中加速 sbt scala 构建?

scala - "Distributive property"与无形

scala - HList的证据保全LUB约束

scala - 用简单的界限表达类型不等式条件