2016-07-09 3 views
0

Ich habe die folgende JSON-Zeichenfolge. In scala möchte ich einige Felder extrahieren und sie in einem neuen json speichern.Fehlermeldung: Versuchen Sie ein implizites Schreiben oder Format für diesen Typ zu implementieren

{"query":"doi:10.1186/s13612-016-0045-3","result":[{"total":"1","start":"1","pageLength":"10"}],"records":[{"identifier":"doi:10.1186/s13612-016-0045-3","url":[{"format":"","platform":"","value":" http://dx.doi.org/10.1186/s13612-016-0045-3 "}],"title":"Technology and Reflection: Mood and Memory Mechanisms for Well-Being","creators":[{"creator":"Konrad, Artie"},{"creator":"Tucker, Simon"},{"creator":"Crane, John"},{"creator":"Whittaker, Steve"}],"publicationName":"Psychology of Well-Being","issn":"2211-1522","openaccess":"true","journalid":"13612","doi":"10.1186/s13612-016-0045-3","publisher":"Springer","publicationDate":"2016-06-15","volume":"6","number":"1","issuetype":"","topicalCollection":"","startingPage":"1","copyright":"©2016 The Author(s)","genre":"OriginalPaper","abstract":"AbstractBackgroundWe report a ..."}],"facets":[{"name":"subject","values":[{"value":"Biological Psychology","count":"1"},{"value":"Health Psychology","count":"1"},{"value":"Neuropsychology","count":"1"},{"value":"Positive Psychology","count":"1"},{"value":"Psychology","count":"1"},{"value":"Quality of Life Research","count":"1"}]},{"name":"pub","values":[{"value":"Psychology of Well-Being","count":"1"}]},{"name":"year","values":[{"value":"2016","count":"1"}]},{"name":"country","values":[{"value":"United States","count":"1"},{"value":"USA","count":"1"}]},{"name":"type","values":[{"value":"Journal","count":"1"}]},{"name":"keyword","values":[{"value":"Emotion","count":"1"},{"value":"Memory","count":"1"},{"value":"Mood","count":"1"},{"value":"Reflection","count":"1"},{"value":"Reminiscence","count":"1"},{"value":"Technology mediated reflection","count":"1"},{"value":"Well-being","count":"1"}]}]}

Insbesondere möchte ich die folgende neue JSON-Objekt erhalten (dh Extrakt Felder „Schöpfer“, „Publica“ und „abstrakt“, und umbenennen entsprechend):

{"creators":[{"creator":"Konrad, Artie"},{"creator":"Tucker, Simon"},{"creator":"Crane, John"},{"creator":"Whittaker, Steve"}],"pubTitle":"Psychology of Well-Being","pubAbstract":"AbstractBackgroundWe report ..."}

Diese Ist mein aktueller Code, aber ich habe die Fehlermeldung Error:(137, 27) No Json serializer found for type play.api.libs.json.JsResult[org.test.Publication]. Try to implement an implicit Writes or Format for this type. val json = Json.toJson(processedPubl).

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 
import play.api.data.validation.ValidationError 
import play.api.libs.json.Reads._ 

case class Creator(creator: String) 
case class Publication(pubTitle: String, creators: Seq[Creator], pubAbstract: String) 

val jsonstring = ... // this is the raw string provided 
        // at the beginning of this post 

implicit val publReads: Reads[Publication] = (
     (JsPath \ "publicationName").read[String] and 
     (JsPath \ "creators").read[Seq[Creator]] and 
     (JsPath \ "abstract").read[String] 
    ) (Publication.apply _) 

val processedPubl = Json.parse(jsonstring).validate[Publication](publReads) 

val json = Json.toJson(processedPubl) 
+0

Sie könnten versuchen, Json-Play oder Sphere-Json, beide scheinen in Ordnung [link] (http://manuel.bernhardt.io/2015/11/06/a-quick-tour-of-json-libraries-in -scala /) – sarnthil

+0

@sarnthil: Danke. Ich habe meinen Beitrag aktualisiert. Ich habe immer noch eine Fehlermeldung, wenn ich den Kern laufen lasse. – Klue

+0

Warum implementieren Sie keinen Writer? Fehlermeldung ist offensichtlich. –

Antwort

1

Sie sollten dies versuchen:

import play.api.libs.functional.syntax._ 
import play.api.libs.json._ 

case class Creator(creator: String) 
case class Publication(pubTitle: String, creators: Seq[Creator], pubAbstract: String) 

val jsonString = ... 

implicit val creatorFormat = Json.format[Creator] 
implicit val publWrites = Json.writes[Publication] 
implicit val publReads: Reads[Publication] = (
    (JsPath \ "publicationName").read[String] and 
    (JsPath \ "creators").read[Seq[Creator]] and 
    (JsPath \ "abstract").read[String] 
)(Publication.apply _) 

val input = Json.parse(jsonString).as[Publication] 
val output = Json.toJson(input) 

Reads ist etwas, das während des Lesens von JSON verwendet wird (input diese verwendet) und Writes ist etwas, das während des Schreibens zu JSON verwendet wird (output verwendet es) . Zusammen bilden sie etwas, das Format genannt wird. Da Sie in Ihrem Code Fallklassen verwenden, können Sie diese Lese-/Schreibvorgänge/Formate mithilfe von json-Methoden von play automatisch generieren.

+0

Ich denke, es berücksichtigt nicht, dass das Feld 'publicationName' als' pubTitle' und 'abstract' als' pubAbstract' geschrieben werden sollte. Mit anderen Worten, ich sollte Originaltitel von Feldern umbenennen und ihre Werte mit neuen Titeln im endgültigen JSON speichern. Deshalb habe ich Read verwendet. – Klue

+0

@Klue sollten Sie die aktualisierte Lösung ausprobieren. –

+0

Welche Version von Scala verwenden Sie? Ich bekomme diesen Fehler in 2.11.4: "Fehler: (122, 46) kann Makros nicht erweitern, die von früheren Versionen von Scala implizit erstellt wurden. CreatorFormat = Json.format [Creator]' – Klue

Verwandte Themen