Scala - 使用 ScalaJson Play Framework 解析来自 API 的 JSON 数据
Scala - parse JSON data from API with ScalaJson Play Framework
首先,我实现了一种从 csv 文件构建 Map[Double, String]
的方法。该地图包含 (k,v) 的 saleId、saleType。
以下是我的实现方式:
val stream : InputStream = getClass.getResourceAsStream("/sales.csv")
val lines: Iterator[String] = scala.io.Source.fromInputStream(stream).getLines
val map: Map[Double, String] = lines
.map(_.split(","))
.map(line => (line(0).toDouble, line(1).toString))
.toMap
现在我想更进一步,获取用于使用来自 API 的数据构建地图的数据。具有相同的 k,v (saleId, saleType)。 API 返回的 Json 包含此数据作为字段。
Json 看起来像这样:
[{
"saleId": 1234,
"name": "New name",
"saleType": "New Type"
},
{
"saleId": 2345,
"name": "New name1",
"saleType": "New Type1"
}]
所以我尝试了使用 ScalaJson Play Framework 的方法。因为我只需要 JSON 中的两个字段,所以我决定使用 class SalesData
.
object SalesProcessor {
case class SalesData(saleId: Int, saleType: String)
implicit val of: Reads[SalesData] = reads[SalesData]
val rawJson: String = Source.fromURL("https://mytest.com/api/sales.json").mkString
val salesJson: JsValue = Json.parse(rawJson)
val salesData: SalesData = salesJson.as[SalesData]
def main(args: Array[String]): Unit = {
println(salesData.saleId)
}
当我 运行 上述代码时,出现以下错误:
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsobject),WrappedArray())))))
UPD: 在我使用 tea-addict
提出的解决方案后,它开始失败并出现以下错误:
JsResultException(errors:List((/saleId,List(JsonValidationError(List(error.path.missing),WrappedArray()))), (/saleType,List(JsonValidationError(List(error.path.missing),WrappedArray())))))
您可以阅读特定字段并像这样创建您的 SalesData
。
Sales.json
[{
"saleId": 1234,
"name": "New name",
"saleType": "New Type"
},
{
"saleId": 2345,
"name": "New name1",
"saleType": "New Type1"
}]
代码
object SalesProcessor {
case class SalesData(saleId: Int, saleType: String)
implicit val saleReads: Reads[SalesData] = (
(JsPath \ "saleId").read[Int] and
(JsPath \ "saleType").read[String]
) (SalesData.apply _)
val rawJson: String = Source.fromURL("https://mytest.com/api/sales.json").mkString
val salesJson: JsValue = Json.parse(rawJson)
val salesData: List[SalesData] = salesJson.as[List[SalesData]]
def main(args: Array[String]): Unit = {
println(salesData(0).saleId)
}
}
首先,我实现了一种从 csv 文件构建 Map[Double, String]
的方法。该地图包含 (k,v) 的 saleId、saleType。
以下是我的实现方式:
val stream : InputStream = getClass.getResourceAsStream("/sales.csv")
val lines: Iterator[String] = scala.io.Source.fromInputStream(stream).getLines
val map: Map[Double, String] = lines
.map(_.split(","))
.map(line => (line(0).toDouble, line(1).toString))
.toMap
现在我想更进一步,获取用于使用来自 API 的数据构建地图的数据。具有相同的 k,v (saleId, saleType)。 API 返回的 Json 包含此数据作为字段。
Json 看起来像这样:
[{
"saleId": 1234,
"name": "New name",
"saleType": "New Type"
},
{
"saleId": 2345,
"name": "New name1",
"saleType": "New Type1"
}]
所以我尝试了使用 ScalaJson Play Framework 的方法。因为我只需要 JSON 中的两个字段,所以我决定使用 class SalesData
.
object SalesProcessor {
case class SalesData(saleId: Int, saleType: String)
implicit val of: Reads[SalesData] = reads[SalesData]
val rawJson: String = Source.fromURL("https://mytest.com/api/sales.json").mkString
val salesJson: JsValue = Json.parse(rawJson)
val salesData: SalesData = salesJson.as[SalesData]
def main(args: Array[String]): Unit = {
println(salesData.saleId)
}
当我 运行 上述代码时,出现以下错误:
play.api.libs.json.JsResultException: JsResultException(errors:List((,List(JsonValidationError(List(error.expected.jsobject),WrappedArray())))))
UPD: 在我使用 tea-addict
提出的解决方案后,它开始失败并出现以下错误:
JsResultException(errors:List((/saleId,List(JsonValidationError(List(error.path.missing),WrappedArray()))), (/saleType,List(JsonValidationError(List(error.path.missing),WrappedArray())))))
您可以阅读特定字段并像这样创建您的 SalesData
。
Sales.json
[{
"saleId": 1234,
"name": "New name",
"saleType": "New Type"
},
{
"saleId": 2345,
"name": "New name1",
"saleType": "New Type1"
}]
代码
object SalesProcessor {
case class SalesData(saleId: Int, saleType: String)
implicit val saleReads: Reads[SalesData] = (
(JsPath \ "saleId").read[Int] and
(JsPath \ "saleType").read[String]
) (SalesData.apply _)
val rawJson: String = Source.fromURL("https://mytest.com/api/sales.json").mkString
val salesJson: JsValue = Json.parse(rawJson)
val salesData: List[SalesData] = salesJson.as[List[SalesData]]
def main(args: Array[String]): Unit = {
println(salesData(0).saleId)
}
}