在数组数组中转换Json

时间:2016-11-09 09:41:13

标签: arrays json scala playframework

我需要转换这个json(我从一个像jsonString值的rdd spark中获取)

[
  {
    "Quantita": 6,
    "Provincia": "BARI",
    "GENERE": "Avventura"
  },

  {
    "Quantita": 30,
    "Provincia": "BARI",
    "GENERE": "Storia"
  },
  {
    "Quantita": 6,
    "Provincia": "MODUGNO",
    "GENERE": "Avventura"
  },

  {
    "Quantita": 6,
    "Provincia": "MODUGNO",
    "GENERE": "Storia"
  },
  {
    "Quantita": 8,
    "Provincia": "MODUGNO",
    "GENERE": "Avventura"
  }]

在这样的数组中:

[
    ['Bari','Avventura',6],
    ['Bari','Storia',30],
    ['Modugno','Avventura',6],
    ['Modugno','Giallo',6],
    ['Modugno','Storia',6],
    ['Avventura','Bari',6],
    ['Avventura','Modugno',6],
    ['Storia','Bari',30],
    ['Storia','Modugno',6]
] 

我使用play框架,我尝试制作像这样的案例类

case class Libro_D(
    quantita: Int, 
    provincia: String, 
    genere: String   
    )

然后我使用read方法:

implicit val recordReads: Reads[Libro_D] = (
      (JsPath \ "Quantita").read[Int] and
        (JsPath \ "Provincia").read[String] and
        (JsPath \ "GENERE").read[String]
      )(Libro_D.apply _)

我创建了一个这样的列表:

val parsedJson = Json.parse(JString_D.stripMargin)

    implicit val f = Json.format[Libro_D]
     println(parsedJson.validate[List[Libro_D]] match {
      case JsSuccess(value, _) => value.map { record => s"""[${record.provincia},${record.genere},${record.quantita}]\n"""}.mkString("[", ",", "]")
      case JsError(_) => println("")
    })

所以我有一个问题。当我打印列表时,是空的。为什么? 有人可以帮帮我吗?我使用Scala Play框架

2 个答案:

答案 0 :(得分:0)

如果只需要转换json,请参阅JSON transformers

简单转换可以帮助您:

val t = __.read[List[JsArray]](
  list(
    __.read[JsObject].map(o => 
      List((o \ "Provincia").get, (o \ "GENERE").get, (o \ "Quantita").get)
    ).map(JsArray)    
  )
).map(JsArray)

json.transform(t)

scala> res9: play.api.libs.json.JsResult[play.api.libs.json.JsArray] = JsSuccess([["BARI","Avventura",6],["BARI","Storia",30],["MODUGNO","Avventura",6],["MODUGNO","Storia",6],["MODUGNO","Avventura",8]],)

答案 1 :(得分:-1)

parsedJson不是List[Libro_D]。这是play.api.libs.json.JsArray。将代码更改为parsedJson.validate[JsArray]。如果是JsSuccess,请打印相应的消息(因为value.map无效)