私はPlayフレームワークアプリケーション(Scala)でJsonリーダーを作成しようとしています。問題は、私のJsonの一部がちょっとファンキーで、値を取得するためにさらに処理する必要があるということです。たとえば、次の場合クラスとPlay Json - 複合オブジェクトの作成
{
"field1":"value1",
"field2":"value/1",
"num2":2
}
:
case class Field1(text: String, fields: Field2)
case class Field2(text: String, num: Int, num2: Int)
基本的Field2
ためtext
とnum
フィールドは、テキストを分割することによって、値value/1
由来します。
def splitter(path: String, num2: Int): Field2 = {
val split = path.split("\\")
Field2(split(0), split(1).toInt, num2)
}
これはかなり簡単です。実際のスプリッタ機能ははるかに複雑です。基本的に、このオブジェクトを構成する唯一の方法は、必要なオブジェクトを吐き出す関数に単一の文字列を渡すことです。Field2
Field2
(拡張子はField1
)のリーダーを作成するにはどうすればよいですか?
ここで私がこれまで持っているものです。
object Field1 {
implicit val reader = (
(__ \ "field1").read[String] and
(__).read[Field2]
) (Field1.apply _)
}
object Field2 {
implicit val reader = (
splitter((__ \ "field2").read[String], (__ \ "num2"))
) // Obviously incorrect syntax + type mismatch, but this is roughly what I'm trying to accomplish.
}
を使用することができます。しかし、通常の機能構文を使用する方法はありませんか?私はコードの他の部分でこれを使用しましたが、物事を一貫させておきたいと思います。 – Jeff
@Jeff機能的な構文の問題は、物事を計算するために前のフィールドを参照できないことです。適用を呼び出すと、生成されたReaderを変更できますが、計算したデータを追跡するためには中間型が必要です。さらに、特定の状況下では、機能的な構文でパフォーマンスの問題が発生する可能性があります。https://www.lucidchart.com/techblog/2016/08/29/speeding-up-restful-services-in-play-framework/ – gregghz
@Jeff私は機能構文を使用する例を追加しました。 – gregghz