如何在play scala中正确验证和转换json?

时间:2015-04-23 11:13:17

标签: json scala

我正在尝试解析和转换json文件,以便它可以适合数据库结构。我有以下json文件。

{
  "request": {
    "Target": "AR",
    "Format": "jsonp",
    "Service": "HasOff",
    "Version": "2",
    "NetworkId": "xyz",
    "Method": "getConversions",
    "api_key": "xyz",
    "fields": [
      "Offer.name",
      "Stat.datetime",
      "Stat.conversion_status",
      "Stat.approved_payout",
      "Stat.ip",
      "Stat.ad_id",
      "Stat.affiliate_info1",
      "Stat.offer_id"
    ],
    "data_start": "2015-04-16 23:59:59",
    "data_end": "2015-04-18 00:00:00",
    "callback": "angular.callbacks._3",
    "_ga": "GA1.2.1142892596.1429262595",
    "_gat": "1"
  },
  "response": {
    "status": 1,
    "httpStatus": 200,
    "data": {
      "page": 1,
      "current": 100,
      "count": 521,
      "pageCount": 6,
      "data": [
        {
          "Offer": {
            "name": "ABC Company"
          },
          "Stat": {
            "datetime": "2015-04-19 12:09:01",
            "conversion_status": "approved",
            "approved_payout": "26.94000",
            "ip": "111.11.11.1",
            "ad_id": "123456",
            "affiliate_info1": "123456",
            "offer_id": "260"
          }
        },
        {
          "Offer": {
            "name": "ABC Company"
          },
          "Stat": {
            "datetime": "2015-04-11 01:01:38",
            "conversion_status": "approved",
            "approved_payout": "44.94000",
            "ip": "49.204.222.117",
            "ad_id": "123456",
            "affiliate_info1": "123456",
            "offer_id": "260"
          }
        },

为了处理它,我编写了一个案例类,为类建模并尝试将json转换为模型,如 - https://www.playframework.com/documentation/2.2.x/ScalaJson中所示。代码段如下。为简洁起见,我减少了案例类中的参数数量。

case class ConversionReport(offerName: String, date: DateTime)
implicit val readConversion: Reads[ConversionReport] = (
      (__ \ "response" \ "data" \ "data" \ "Offer" \ "name").read[String] and
      (__ \ "response" \ "data" \ "data" \ "Stat" \ "datetime").read[DateTime]
  ) (ConversionReport)

  def getConversionReport(){

    val conversionUrl: String = "http://some_link" 
    val holder = WS.url(conversionUrl).get()
    val result = Await.result(holder, Duration(10, "second")).json
    val conversionResult: JsResult[ConversionReport] = result.validate[ConversionReport]
    println ("xxxx The conversion result is " +conversionResult)

  }

当我执行代码时,我收到错误 -

xxxx The conversion result is JsError(List((/offerName,List(ValidationError(error.path.missing,WrappedArray()))), (/date,List(ValidationError(error.path.missing,WrappedArray())))))

我想,我无法正确建模json文件。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

在这种情况下,数据是一个数组,因此您的方法不起作用。你将不得不改变一些事情。

import play.api.libs.json._
import play.api.libs.json.Reads._

case class ConversionReport(offerName: String, date: DateTime)

implicit val readConversion: Reads[ConversionReport] = (
  (__\ "Offer" \ "name").read[String] and
  (__ \ "Stat" \ "datetime").read[DateTime]
) (ConversionReport)

case class FullReport( reportList: Seq[ ConversionReport ] )
implicit val readFullReport: Reads[ FullReport ] = (
  (__ \ "response" \ "data" \ "data").lazyRead( Reads.seq[ ConversionReport ]( readConversion ) )
) ( FullReport )

def getConversionReport(){

  val conversionUrl: String = "http://some_link" 
  val holder = WS.url(conversionUrl).get()
  val result = Await.result(holder, Duration(10, "second")).json

  val conversionResult: JsResult[FullReport] = result.validate[FullReport]
  println ("xxxx The conversion result is " +conversionResult)

}