2

List[E]Arnaut libを使用してタイプのフィールドをjsonにエンコードしたいと思います。

sealed trait Msg[E] {
  val contents: List[E]    

  def send(): Unit = {
    val json = contents.asJson
    println("Sending json: " + json.toString())
  }
}

次に、StringMsgケースクラスがあります:

case class StringMsg(contents: List[String]) extends Msg[String]

アルゴナウト lib はJsonIdentity[J]特性を定義します:

trait JsonIdentity[J] {
  val j: J

  /**
   * Encode to a JSON value using the given implicit encoder.
   */
  def jencode(implicit e: EncodeJson[J]): Json =
    e(j)
}

の新しいインスタンスを作成しStringMsgてメソッドを呼び出すとsend()、次のエラーが発生します。

StringMsg(List("a","b")).send()

パラメーター e の暗黙的な値が見つかりませんでした: argonaut.EncodeJson[List[E]]

4

1 に答える 1

3

API はargonaut.EncodeJson[List[E]]、クライアント コードから暗黙的に要求する必要があります。

sealed trait Msg[E] {
  val contents: List[E]
  implicit def encodeJson: argonaut.EncodeJson[List[E]] //to be implemented in subclass   

  def send(): Unit = {
    val json = contents.asJson
    println("Sending json: " + json.toString())
  }
}

//or

abstract class Msg[E](implicit encodeJson: argonaut.EncodeJson[List[E]]) {
  val contents: List[E]

  def send(): Unit = {
    val json = contents.asJson
    println("Sending json: " + json.toString())
  }
}

//or

sealed trait class Msg[E] {
  val contents: List[E]

  def send()(implicit encodeJson: argonaut.EncodeJson[List[E]]): Unit = {
    val json = contents.asJson
    println("Sending json: " + json.toString())
  }
}

クライアントコードのどこかに:

case class StringMsg(contents: List[String]) extends Msg[String] { 
   implicit val encodeJson = argonaut.StringEncodeJson 
}

//or

import argonaut.StringEncodeJson //or even import argonaut._
case class StringMsg(contents: List[String]) extends Msg[String]() //implicit will be passed here

//or

import argonaut.StringEncodeJson //or even import argonaut._
case class StringMsg(contents: List[String]) extends Msg[String]
val a = StringMsg(Nil)
a.send() //implicit will be passed here
于 2015-04-07T14:10:07.450 に答える