2016-09-27 4 views
0

現在、スカラ2.11.5を使用しています。クラスの1つに22個のフィールドがあります。周りを見たらScalaケースは22個のフィールドを持ちますが、スカラでplay-jsonとの問題があります。2.11.5

case class CreateTransactionRequest(name: Option[String], 
            balance: Option[BigDecimal], 
            amount: BigDecimal, 
            currency: String, 
            dueDate: Option[DateTime], 
            orderDate: DateTime, 
            billing: Option[CreateAddressRequest], 
            shipping: Option[CreateAddressRequest], 
            status: String, 
            email: String, 
            paymentMethod: String, 
            paymentTerm: Option[String], 
            deliveryMethod: Option[String], 
            source: String, 
            attachments: Option[String], 
            agent: Option[String], 
            orders: Option[Set[CreateOrderRequest]], 
            otherCharges: Option[Seq[CreateTransactionOtherChargeRequest]], 
            notes: Option[Seq[CreateNoteRequest]], 
            subscribers: Option[Seq[String]], 
            trackingId: Option[String], 
            acquisition: Option[String]) 

implicit val readsCreateTransactionRequest: Reads[CreateTransactionRequest] = Json.reads[CreateTransactionRequest] 

私は私が続くと、このlinkから試みていることを確信しているソリューションのに出くわしたし、それに

val fields1to12: Reads[(Option[String], Option[BigDecimal], BigDecimal, String, Option[DateTime], DateTime, Option[CreateAddressRequest], Option[CreateAddressRequest], String, String, String, Option[String])] = (
    (__ \ "name").read[Option[String]] and 
    (__ \ "balance").read[Option[BigDecimal]] and 
    (__ \ "amount").read[BigDecimal] and 
    (__ \ "currency").read[String] and 
    (__ \ "dueDate").read[Option[DateTime]] and 
    (__ \ "orderDate").read[DateTime] and 
    (__ \ "billing").read[Option[CreateAddressRequest]] and 
    (__ \ "shipping").read[Option[CreateAddressRequest]] and 
    (__ \ "status").read[String] and 
    (__ \ "email").read[String] and 
    (__ \ "paymentMethod").read[String] and 
    (__ \ "paymentTerm").read[Option[String]] 
).tupled 

    val fields13to22: Reads[(Option[String], String, Option[String], Option[String], Option[Set[CreateOrderRequest]], Option[Seq[CreateTransactionOtherChargeRequest]], Option[Seq[CreateNoteRequest]], Option[Seq[String]], Option[String], Option[String])] = (
    (__ \ "deliveryMethod").read[Option[String]] and 
    (__ \ "source").read[String] and 
    (__ \ "attachments").read[Option[String]] and 
    (__ \ "agent").read[Option[String]] and 
    (__ \ "orders").read[Option[Set[CreateOrderRequest]]] and 
    (__ \ "otherCharges").read[Option[Seq[CreateTransactionOtherChargeRequest]]] and 
    (__ \ "notes").read[Option[Seq[CreateNoteRequest]]] and 
    (__ \ "subscribers").read[Option[Seq[String]]] and 
    (__ \ "trackingId").read[Option[String]] and 
    (__ \ "acquisition").read[Option[String]] 
).tupled 

implicit val readsCreateTransactionRequest: Reads[CreateTransactionRequest] = (fields1to12, fields13to22) { 
    case((name, balance, amount, currency, dueDate, orderDate, billing, shipping, status, email, paymentMethod, paymentTerm), (deliveryMethod, source, attachments, agent, orders, otherCharges, notes, subscribers, trackingId, acquisition)) => 
    CreateTransactionRequest(name, balance, amount, currency, dueDate, orderDate, billing, shipping, status, email, paymentMethod, paymentTerm, deliveryMethod, source, attachments, agent, orders, otherCharges, notes, subscribers, trackingId, acquisition) 
    } 

を適用します。残念ながら、それは動作していないと私はまだエラーがある

誰かがReadに22のフィールドを分割するいくつかの他の方法を提案することはできますか?

+0

を説明したフィールドのグループがいくつかclass'。 – erip

答えて

0

フルコードは提供されていませんが、コードに問題が発生しています。最初に、あなたはコードの下に書いている:

ここ
(__ \ "billing").read[Option[CreateAddressRequest]] 

CreateAddressRequestはプリミティブ型ではありません。したがって、CreateAddressRequestの暗黙の書き込みを記述する必要があります。

次に、ケースクラスの最大フィールドはオプションです。再生では、オプションのフィールドを手動でシリアル化/デシリアライズすることはできません。だから、あなたは以下のコードを持つ必要があります。

implicit def optionFormat[T: Format]: Format[Option[T]] = new Format[Option[T]] { 
    override def reads(json: JsValue): JsResult[Option[T]] = json.validateOpt[T] 

    override def writes(o: Option[T]): JsValue = o match { 
     case Some(t) => implicitly[Writes[T]].writes(t) 
     case None => JsNull 
    } 
    } 

また、再生でも日付フィールドをシリアル化/逆シリアル化できません。あなたもと書く必要があります。の日付も書いてください。以下はjava.util.Dateのサンプルコードです。

implicit object DateFormat extends Format[java.util.Date] { 
    val format = new java.text.SimpleDateFormat("yyyy-MM-dd") 
    def reads(json: JsValue): JsResult[java.util.Date] = JsSuccess(format.parse(json.as[String])) 
    def writes(date: java.util.Date): JsString = JsString(format.format(date)) 
    } 

サンプルは `ケースを作成here