2017-05-13 1 views
-1

Je suis nouveau à scala. J'essayais d'analyser une réponse d'api dans Scala. La réponse api est au format:scala api réponse json parser de json object

{"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"}}]} 

Mon objectif est de remplir une liste d'id examinateur de la réponse de JSON. J'ai essayé de créer un objet JSON de la réponse par

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

mais ne pourrais pas obtenir les ids de l'examinateur objet JSON. Même essayé d'itérer l'objet JSON, mais n'a pas fonctionné. Quelqu'un aide s'il vous plaît. Merci d'avance.

+0

Quelle est l'analyseur que vous utilisez? – jamborta

+0

pas d'analyseur spécifique. J'ai essayé 'jouer' – das

+0

dans votre exemple, il passe par une fonction 'parse', je voudrais comprendre ce que c'est. Ou demandez-vous une solution générique? – jamborta

Répondre

0

Je ne suis pas familier avec circe mais voici comment vous le feriez avec 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"}}]}""" 

Nécessité de définir le schéma en utilisant des classes de cas:

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

et leur conversion implicite:

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

Ensuite, c'est très simple, l'analyse est juste ceci:

val obj = jsonResponse.parseJson.convertTo[Items] 

Enfin, obtenir les ids pour les examinateurs:

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

Il me donne erreur sur les instructions d'importation lui-même, comme - "Impossible de résoudre le symbole de pulvérisation" et "ne peut pas résoudre le symbole DefaultJsonProtocol". Ai-je besoin d'ajouter des dépendances? Une idée? – das

+0

Oui, vous avez besoin de 'libraryDependencies + =" io.spray "%%" spray-json "%" 1.3.3 "' – jamborta

0

Vous avez mentionné le jeu, alors voici comment vous pouvez le faire en jeu

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

Une fois que vous avez ceux mis en place vous pouvez soit

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

Ou

val reviewer:Reviewer = Json.parse(reviewerJsonString).as[Reviewer] 
val validates:Boolean = Json.parse(reviewerJsonString).validates[Reviewer] 
+0

objet Réviseur {implicite val format = Json.format [Réviseur]} donne une erreur - ne peut pas résoudre le symbole ' format'. Json est circe Json? – das

+0

Ce serait en fait pour play.api.json. Pour autant que je puisse dire à partir de leur documentation, il ne semble pas que circe supporte implicitement marshalling de json à la classe (seulement l'inverse), votre meilleur pari pour l'obtenir dans une classe serait «val foo: Foo = décoder [Foo ] (fooCompatibleJson) '. En sens inverse vous seriez en mesure de faire 'foo.asJson' –

+0

et heres le github pour jouer json https://github.com/playframework/play-json –