2013-10-26 22 views
6

Play Framework 2.1.3でAjax POSTリクエストを処理しようとしています。ポストデータはJSONオブジェクトであるなど、ツリー構造を有する:私は巣 "子供たちは、任意の深たいScala Play FrameworkのJSONツリー構造を読む

{ id: "a", name: "myname", kids : [{ id: "a1", name : "kid1", kids: []}, {id: "a2", name: "kid2", kids: [{id: "aa1", name :"grandkid", kids: []}]}] 

を。私が考えているだろうクラスは、(私が実現再帰が問題となることが)このようなものです:

case class Person { 
    id: String, 
    name: String, 
    kids: Array[Person] 
} 

私が考えているでしょう形式:

implicit val personFormat:Format[Person] = Json.format[Person] 

プレイが私のフォーマットでエラーを投げていること私は書いた:

タイプミスマッチ; found:controllers.Resources.Person required:Array [controllers.Resources.Person]

私はPlayにツリー構造があることを知っています。 JSONの読み込みと結びつける方法の例やドキュメントが見つかりませんでした。

すべてのヘルプは非常に、感謝

答えて

9

あなたは、のようなものを再帰的ヴァルが必要になります。

implicit val jsonReads: Reads[Person] = ((__ \ "id").read[String] and (__ \ "name").read[String] and (__ \ "kids").read[Seq[Person]])(apply _) 

それがより一般的だとあなたがダウンに影響を与えることなく、あなたの実装を変更することができますので、私は、配列への配列からコレクション型を変更しました(コード)

これは、hereと記載されている構文を使用しています。

+0

ありがとうRobin、私はあなたの答えを組み込もうとしています。コンパイルエラー 'not found:value apply'が表示されます。私は何か基本的なものを欠いていますPersonクラスの「子供」はあなたの答えに「Seq [Person]」する必要がありますか?ありがとう! – Joost

+0

ああ、あなたはそれをコンパニオンオブジェクトで宣言していないと思います。だから、 'Person'に' apply'を変更してください。あなたは 'Array'に変更することができますが、Playが' Array'sを自動的に読むことができるかどうかは分かりません。そのため、 'Person'で使われているコレクション型を' Array'から 'Seq'に変更することを提案しました。ごめんなさい。 –

2

私はこの作業があなたのPersonケースクラスにJsArrayまたはArray [文字列]配列の代わりに[人]のいずれかを使用している参照の唯一の方法を高く評価しています。 JSONマクロのインセプションは、暗黙のJSON読み込み+書き込みコードが既に存在するオブジェクトのプリミティブとリスト、マップ、配列の読み込み+書き込みコードを生成するだけです。基本的には、自分自身を参照するcaseクラスを持つことはできません。

package models 

import play.api.libs.json._ 

case class Person(
    id : String, 
    name : String, 
    kids : JsArray 
) 

object Person extends ((String,String,JsArray) => Person) { 

    implicit val jsonFormat = Json.format[Person] 

} 
+1

それは良いデザインではありません。それはワイヤ表現を露出している。 XMLを受け入れることにしたらどうしますか? –

+1

質問はJSON構造を読み取る方法でしたが、XMLは無関係です。 –

+1

私は、潜在的な将来の設計決定について話しています。しかし、それにかかわらず、あなたのケースクラスにワイヤ表現を公開すべきではありません。それは、クライアントコードがデシリアライズを心配する必要があります。これは心配する必要はありません。 –

関連する問題