2017-09-10 8 views
1

応答には常にtotal-countentitiesのAPIがありますが、entitiesはさまざまな種類のAPIです。私がしようとしているのは、より包括的なcase-classesに変換するための解析を&にすることです。一般的なjson-sprayパーサーの階層を定義するにはどうすればよいですか?

だから、次の種類

case class StandardReturn[A](
    `total-count`: Double, 
    entities: List[A] 
) 

case class System(
    id: String, 
    name: String 
) 

し、次の例にしよう:

当然のこと/ Iはケースクラスを設定する方法を私に

Error:(34, 42) value entities is not a member of type parameter A 
entityString.parseJson.convertTo[A].entities // Where I'm running into trouble 
            ^

を与えている

object SystemProtocol extends DefaultJsonProtocol { 
    implicit val systemFormat: RootJsonFormat[System] = 
    jsonFormat2(System) 
    implicit def entityFormat[A: JsonFormat] = 
    jsonFormat(StandardReturn.apply[A], "total-count", "entities") 
} 
import SystemProtocol._ 

val response = """{ 
    "total-count": 10, 
    "entities": [ 
    { "id": "1", "name": "me" } 
    ] 
}""" 

class Example { 
    def transform[A: JsonReader](entityString: String) = 
    entityString.parseJson 
     .convertTo[A] 
     .entities // Where I'm running into trouble 
} 
object Example { 
    val transformed = new Example().transform[StandardReturn[System]](response) 
} 
Example.transformed 

タイプは、transformが確実にentitiesが保証されますはAAStandardReturn[A])の型に変換した後に存在しますか?私はスカラ型システムにあまり慣れていないので、助けてくれてありがとう。

答えて

0

コードでは、タイプパラメータAには、JsonReaderにバインドされたコンテキスト(タイプJsonReader[A]の暗黙のパラメータ)以外の境界はありません。したがって、既に言及したように、Aは何でもかまいませんので、entitiesメソッドを呼び出すことはできません。 Aの代わりにStandardReturn[A]に変換すると、この問題は解決されます。

def transform[A: JsonReader](entityString: String) = 
    entityString.parseJson 
    .convertTo[StandardReturn[A]] <- just convert to what you actually want 
    .entities 

はまた、あなたは、上記の方法が変更されたとして、ちょうどSystemの代わりStandardReturn[System]によってnew Example().transform[StandardReturn[System]](response)内の型パラメータを交換する必要があります。

コンパイラで暗黙の型パラメータJsonReader[StandardFormat[System]]が必要になりました。しかし暗黙的な範囲では(SystemProtocol)のsystemFormatしかありません。コンパイラはまだあきらめていません。JsonReader[System]からJsonReader[StandardFormat[System]]への暗黙の変換を見つけようとしています。これは定義したメソッドentityFormatです。うん!

最後の一つの発言:documentationに述べたように、あなたが、jsonFormat2(StandardReturn.apply[A])jsonFormat(StandardReturn.apply[A], "total-count", "entities")を交換する場合は、別の方法entityFormatを簡素化することができます。

関連する問題