【问题标题】:Shapeless: could not find implicit for Coproduct mappingShapeless:找不到 Coproduct 映射的隐式
【发布时间】:2018-10-25 21:41:17
【问题描述】:

我有以下代码,它使用 circe 反序列化一个可以有两种形状的 json(请参阅 jsonPersonalDetails 和 jsonPersonalAddress 的值)。当我尝试从 SearchCriteria 调用方法 transform 时,我得到:

错误:(38, 26) 找不到参数映射器的隐式值:shapeless.ops.coproduct.Mapper.Aux[com.example.circe.CirceShapeApp.transformer.type,com.example.circe.CirceShapeApp.SearchBy ,com.example.circe.CirceShapeApp.JsonPayload]

你能帮我弄清楚为什么隐式映射器没有解析吗?

谢谢!

    import io.circe.generic.auto._
    import io.circe.shapes._
    import io.circe.parser._
    import shapeless._
    import shapeless.ops.coproduct.Mapper

    object CirceShapeApp extends App {

      val jsonPersonalDetails = """{"searchCriteria": {"birthDate":"01-01-1980", "lastName":"John"}}""".stripMargin
      val jsonPersonalAddress = """{"searchCriteria": {"postalCode":"10776", "houseNumber":"34"}}""".stripMargin

      class SearchCriteria(val searchCriteria: SearchBy) {

        def transform(implicit mapper: Mapper.Aux[transformer.type, SearchBy, JsonPayload]) = {
          searchCriteria map transformer
        }
      }

      case class PersonalDetails(birthDate: String, lastName: String)

      case class PersonalAddress(postalCode: String, houseNumber: String)

      type SearchBy = PersonalDetails :+: PersonalAddress :+: CNil
      type JsonPayload = String :+: CNil

      object transformer extends Poly1 {

        implicit def casePersonalDetails = at[PersonalDetails](v => s"""{"bd": "${v.birthDate}", "ln":"${v.lastName}"}""")

        implicit def casePersonalAddress = at[PersonalAddress](v => s"""{"pc": "${v.postalCode}", "hn":"${v.houseNumber}"}""")

      }

      val result = decode[SearchCriteria](jsonPersonalDetails).right.get
      println(result.searchCriteria.map(transformer)) //WORKS
      println(result.transform) //DOESN'T WORK => COMPILATION ERROR
    }

【问题讨论】:

标签: scala shapeless circe


【解决方案1】:

我发现了问题。 JsonPayload 类型定义不正确。而不是:

type JsonPayload = String :+: CNil

我应该有:

type JsonPayload = String :+: String :+: CNil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-24
    • 2018-09-01
    • 2021-08-29
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多