2016-05-30 11 views
1

私のデータの一部を保存するケースクラスを作成しました。既存のJSONオブジェクトにsprayJSON(スカラ)を使用してフィールドを追加します

case class Job(id: Option[Int], title: String, description: Option[String], 
       start: Date, end: Option[Date], customerId: Int) 

私は読んで/私のJSONオブジェクトを書き込むために、次のフォーマッタを使用していました:

implicit val jobFormat = jsonFormat6(Job.apply) 

私は必要なので、私は書き込み/読み出しを持ついくつかの問題を持っている場合、クラスは、次のようになります。 JSON(ではなく、ケースクラスではなく)にフィールドを追加します。たとえば、「test」:「test」です。私は次のコードでカスタムの読み書きをしようとしました:

implicit object jobFormat extends RootJsonFormat[Job] { 
    override def read(json: JsValue): JobRow = ??? 

    override def write(job: Job): JsValue = ?? 
} 

私はこの問題を手伝ってくれましたか?

ありがとうございます!

+0

もう少し文脈を提供してください。 JSONがケースクラスに整列されていないときに "test"プロパティを無視しますか? IIRCの追加プロパティはデフォルトでは無視されます。または、非整列時にプロパティにアクセスするには何らかの方法が必要ですか? – devkat

+0

ケースクラスには6つの要素がありますが、ケースクラスに追加せずに7番目の要素をJSONに追加します。 私の質問です:これは書き込み/読み取り全体を記述することなく可能ですか? –

答えて

3

jsonFormat6とは、自動生成されたRootJsonFormat[Job]オブジェクトを作成することです。カスタムインスタンスを作成するには、RootJsonFormat[Job]を拡張します。この場合、自動生成されたインスタンスをデコレートし、writeメソッドのロジックを追加するカスタムインスタンスを作成する必要があります。

コードは次のようになります。

implicit object JobFormat extends RootJsonFormat[Job] { 
    // to use autogenerated jobFormat 
    val jobFormat = jsonFormat6(Job.apply) 

    // leave read at it is 
    override def read(json: JsValue): JobRow = 
    jobFormat.read(json) 

    // Change write to add your custom logic 
    override def write(job: Job): JsValue = { 
    val json = jobFormat.write(job).asJsonObject 
    JsObject(json.fields + ("test" -> JsString("test"))) 
    } 
} 

PS:私は、コードをコンパイルしていない、しかし、全体的な実装は次のようになります。

+0

ありがとう、これは私の問題を解決! –

関連する問題