2017-05-13 124 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 –