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

Java 来自JSON对象的Scala API响应JSON解析器,java,json,scala,dictionary,flatmap,Java,Json,Scala,Dictionary,Flatmap,我是斯卡拉的新手。我试图在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"

我是斯卡拉的新手。我试图在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的列表。我试图通过

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

但无法从json对象获取审阅者ID。甚至尝试迭代JSON对象,但没有成功。

我不熟悉
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)

你提到了游戏,下面是你如何在游戏中做到这一点

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


您使用的解析器是什么?不是任何特定的解析器。我在您的示例中尝试了“play”,它通过一个
parse
函数,我想了解这是什么。或者您是在寻求一个通用解决方案?circeI支持的parse()没有添加导入语句-import io.circe.\u它在导入语句本身给了我错误,如“无法解析符号喷射”和“无法解析符号DefaultJsonProtocol”。我需要添加一些依赖项吗?有什么线索吗?是的,您需要
libraryDependencies+=“io.spray”%%“spray json”%%“1.3.3”
object Reviewer{implicit val format=json.format[Reviewer]}给出错误-无法解析符号“format”。Json是circe Json?这实际上是用于play.api.Json的。就我从他们的文档中可以看出,circe似乎不支持从json到类的隐式封送(仅相反),将其放入类中的最佳选择是
val foo:foo=decode[foo](fooCompatibleJson)
。相反,您可以执行
foo.asJson
val reviewer:Reviewer = Json.parse(reviewerJsonString).as[Reviewer]
val validates:Boolean = Json.parse(reviewerJsonString).validates[Reviewer]