json4s, «при попытке объединить неявное представление из списка класса дел в JValue» - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь сгенерировать json, объединив несколько полей, включая Seq case-класса.

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") ~ ("атрибуты" -> список (CC ("123", 123), CC ("222", 222)))

Ошибка: (9, 36) недостаточно аргументов для метода ~: (неявный ev1: List [JsonExample.CC] => org.json4s.JsonAST.JValue) org.json4s.JsonAST.JObject. Не указано значение параметра ev1. val json = ("api_key" -> "1234") ~ ("атрибуты" -> список (CC ("123", 123), CC ("222", 222)))

Обратите внимание, если я уберу комбайн ~, тогда он будет работать: val json = ("атрибуты" -> список (CC ("123", 123), CC ("222", 222)))

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете увидеть в разделе «Расширение DSL» , что если вы хотите добавить поддержку класса 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))
}
...