我需要转换这个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框架
答案 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
无效)