来自JSON对象的Scala API响应JSON解析器

问题描述 投票:-1回答:2

我是Scala的新手。我试图在Scala中解析API响应。 API响应的格式如下:

{"items":[{"name":"john", "time":"2017-05-11T13:51:34.037232", "topic":"india", "reviewer":{"id":"12345","name":"jack"}}, 
          {"name":"Mary", "time":"2017-05-11T13:20:26.001496", "topic":"math", "reviewer":{"id":"5678","name":"Tom"}}]}

我的目标是从JSON响应中填充审阅者ID的列表。我尝试从响应中创建一个JSON对象

val jsonObject= parse(jsonResponse.getContentString()).getOrElse(Json.empty)

但无法从json对象获取审阅者ID。甚至试图迭代JSON对象,但没有工作。

java json scala dictionary flatmap
2个回答
0
投票

我不熟悉circe,但这里是你如何用spray-json做的

import spray.json._
import DefaultJsonProtocol._

val jsonResponse = """{"items":[{"name":"john", "time":"2017-05-11T13:51:34.037232", "topic":"india", "reviewer":{"id":"12345","name":"jack"}},{"name":"Mary", "time":"2017-05-11T13:20:26.001496", "topic":"math", "reviewer":{"id":"5678","name":"Tom"}}]}"""

需要使用案例类定义架构:

case class Reviewer(id: String, name: String)
case class Item(name: String, time: String, topic: String, reviewer: Reviewer)
case class Items(items: Array[Item])

他们隐含的转换:

implicit val reviewerImp: RootJsonFormat[Reviewer] = jsonFormat2(Reviewer)
implicit val itemConverted: RootJsonFormat[Item] = jsonFormat4(Item)
implicit val itemsConverted: RootJsonFormat[Items] = jsonFormat1(Items)

然后它很简单,解析就是这样:

val obj = jsonResponse.parseJson.convertTo[Items]

最后,获取评论者的ID:

val reviewers = obj.items.map(it => it.reviewer.id)

0
投票

你提到了游戏,所以这就是你在Play中如何做到的

case class Reviewer(id:Long, name:String)
object Reviewer { implicit val format = Json.format[Reviewer] }

一旦你有了这些设置,你也可以

val json:JsValue = Json.toJson(reviewerObject)
val json:JsObject = Json.toJson(reviewerObject).as[JsObject]
val json:String = Json.toJson(reviewerObject).toString // Valid json string

要么

val reviewer:Reviewer = Json.parse(reviewerJsonString).as[Reviewer]
val validates:Boolean = Json.parse(reviewerJsonString).validates[Reviewer]
© www.soinside.com 2019 - 2024. All rights reserved.