2017-05-13 91 views
-1

我是scala新手。我试图解析scala中的api响应。 api响应的格式如下:scala api响应JSON对象json解析器对象

{"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对象,但没有奏效。有人请帮忙。提前致谢。

+0

什么是您正在使用的解析器? – jamborta

+0

不是任何具体的解析器。我在你的例子中尝试'玩' – das

+0

它通过'parse'函数,我想明白那是什么。还是你要求一个通用的解决方案? – jamborta

回答

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类来定义架构:

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

它给我错误导入语句本身,如 - “不能解决符号喷雾”和“无法解析符号DefaultJsonProtocol”。我需要添加一些依赖关系吗?任何线索? – das

+0

是的,你需要'libraryDependencies + =“io.spray”%%“spray-json”%“1.3.3”' – jamborta

0

你提到的发挥,所以这里是你如何能做到这一点在玩

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] 
+0

object Reviewer {implicit val format = Json.format [Reviewer]}给出错误 - 无法解析符号'格式'。 Json是circe Json? – das

+0

这实际上是为play.api.json。 据我可以从他们的文档中看出来,它看起来不像circe支持从json到类的隐式编组(只反过来),你最好把它放到一个类中是'val foo:Foo = decode [Foo ](fooCompatibleJson)'。相反,你将能够做'foo.asJson' –

+0

和继承人的github玩json https://github.com/playframework/play-json –