【问题标题】:json4s, "no implicit view available from List of case class to JValue" when attempting to combinejson4s,“尝试合并时没有从案例类列表到 JValue 的隐式视图”
【发布时间】:2019-08-03 18:18:30
【问题描述】:

我尝试通过组合一些字段来生成 json,包括案例类的 Seq。

import org.json4s._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.{read, write}

object JsonExample extends App {
  case class CC(eid: String, num: Integer)
  implicit val formats:Formats = Serialization.formats(NoTypeHints)

  val json = ("api_key" -> "1234") ~ ("attributes" -> List(CC("123", 123), CC("222", 222)))

  println(write(json))
}

但是我得到了编译错误

错误:(9, 36) List[JsonExample.CC] => org.json4s.JsonAST.JValue 中没有可用的隐式视图。 val json = ("api_key" -> "1234") ~ ("属性" -> List(CC("123", 123), CC("222", 222)))

错误:(9, 36) 方法的参数不足 ~: (implicit ev1: List[JsonExample.CC] => org.json4s.JsonAST.JValue)org.json4s.JsonAST.JObject。 未指定值参数 ev1。 val json = ("api_key" -> "1234") ~ ("属性" -> List(CC("123", 123), CC("222", 222)))

注意,如果我删除组合〜,那么它可以工作: val json = ("属性" -> 列表(CC("123", 123), CC("222", 222)))

请帮忙。

【问题讨论】:

    标签: json scala json4s


    【解决方案1】:

    您可以在"Extending the DSL" section 中看到,如果您想将CC 类支持添加到DSL 中,您应该提供隐式转换type DslConversion = CC => JValue

    所以,你应该这样写:

    import org.json4s._
    import org.json4s.JsonDSL._
    import org.json4s.jackson.Serialization
    import org.json4s.jackson.Serialization.write
    
    object JsonExample extends App {
        implicit val formats = Serialization.formats(NoTypeHints)
    
        case class CC(eid: String, num: Int)
        implicit def ccToJValue(data: CC)(implicit formats: Formats): JValue = Extraction.decompose(data)
    
        val json = ("api_key" -> "1234") ~ ("attributes" -> List(CC("123", 123), CC("222", 222)))
    
        println(write(json))
    }
    

    【讨论】: