Circe 找不到隐式编码器
Posted
技术标签:
【中文标题】Circe 找不到隐式编码器【英文标题】:Circe cannot find implicit encoder 【发布时间】:2017-08-25 21:18:21 【问题描述】:我正在尝试将一些类编码为 json 字符串,但是无论我尝试什么,我的类似乎都无法为我正在使用的案例类找到隐式编码器。
这是我能够缩减到的最小示例。
import io.circe._
import io.circe.generic.semiauto._
import io.circe.generic.auto._
import io.circe.syntax._
case class OneCol(value: String)
object testObject
def main(args: Array[String]): Unit =
val testVal = OneCol("someVal")
println(testVal.asJson)
这会产生以下编译错误
错误:(30, 21) 找不到参数编码器的隐含值: io.circe.Encoder[OneCol] println(testVal.asJson)
我已经尝试过创建半自动编码器
def main(args: Array[String]): Unit =
implicit val enc : Encoder[OneCol] = deriveEncoder
val testVal = OneCol("someVal")
println(testVal.asJson)
这给出了以下错误
错误:(25, 42) 找不到类型的惰性隐式值 io.circe.generic.encoding.DerivedObjectEncoder[A] 隐式 val enc : Encoder[OneCol] = derivedEncoder
错误:(25, 42) 没有足够的参数用于方法 derivedEncoder: (隐式编码: shapeless.Lazy[io.circe.generic.encoding.DerivedObjectEncoder[A]])io.circe.ObjectEncoder[A]。 未指定的值参数编码。 隐式 val enc : Encoder[OneCol] = derivedEncoder
我相当确定自动和半自动编码器生成的全部目的是处理这样的情况,所以我对自己做错了什么有点茫然。
如果版本信息相关,我使用 scala 2.10.4 和 circe 0.7.0(circe-core_2.10,circe-generic_2.10 工件),并使用 maven 作为包管理器。
有谁知道为什么会失败,以及如何正确编译?
编辑:
这是我的 POM 中带有宏插件的部分。已尝试列出的两个编译器插件(已注释和未注释),但仍然给出相同的错误。
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<configuration>
<args>
<!-- work-around for https://issues.scala-lang.org/browse/SI-8358 -->
<arg>-nobootcp</arg>
</args>
<recompileMode>incremental</recompileMode>
<compilerPlugins>
<compilerPlugin>
<groupId>org.scalamacros</groupId>
<artifactId>paradise_2.10.4</artifactId>
<version>2.1.0</version>
</compilerPlugin>
<!--<compilerPlugin>-->
<!--<groupId>org.scala-lang.plugins</groupId>-->
<!--<artifactId>macro-paradise_2.10.2</artifactId>-->
<!--<version>2.0.0-SNAPSHOT</version>-->
<!--</compilerPlugin>-->
</compilerPlugins>
</configuration>
<executions>
<execution>
<id>scala-compile-first</id>
<phase>process-resources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>scala-test-compile-first</id>
<phase>process-test-resources</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
【问题讨论】:
我现在不在电脑前,但在 2.10 上,您需要使用 Macro Paradise 编译器插件才能进行泛型派生。说明在文档中(我可以稍后提供链接)。 @TravisBrown 虽然它最初不存在,但从另一个项目中复制它并不能修复错误。但是我在这里添加了 pom 的相关部分,因为我不知道我是否配置正确。 【参考方案1】:事实证明,circe-core_2.10 依赖于 scala 版本 2.10.6,这意味着我的 scala 版本(2.10.4)与库不兼容,导致了问题。升级到正确版本的 scala 解决了这个问题。
【讨论】:
我建议新项目使用 2.12,如果您的依赖项允许,建议使用 2.11。 @Reactormonk 考虑升级到 2.11,但不幸的是,scala 2.11 不完全支持我们的一些依赖项,所以我暂时锁定了这个。一旦依赖项获得 2.11 支持,将立即升级。 这听起来很奇怪。你确定这些库现在没有被放弃吗?以上是关于Circe 找不到隐式编码器的主要内容,如果未能解决你的问题,请参考以下文章
找不到 AccessLog 类型的编码器。需要隐式 Encoder[AccessLog] 将 AccessLog 实例存储在数据集中