2016-07-09 5 views
0

次のjson文字列があります。スカラーでは、いくつかのフィールドを抽出し、それらを新しいjsonに保存したいと思います。特に エラーメッセージ:このタイプの暗黙的な書き込みまたは書式を実装してください。

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

は、私は次の新しいJSONオブジェクトを取得したい(すなわちエキスフィールド "クリエイター"、 "publicationName" と "抽象的"、および はそれに応じをそれらの名前を変更):

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

これを現在のコードですが、エラーメッセージには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

あなたはjson-playまたはsphere-jsonを試すことができます。どちらもうまくいくようです[リンク](http://manuel.bernhardt.io/2015/11/06/a-quick-tour-of-json-libraries-in -scala /) – sarnthil

+0

@sarnthil:ありがとうございました。私は自分の投稿を更新しました。私はコアを実行すると、まだエラーメッセージが表示されます。 – Klue

+0

ライターを実装してみませんか?エラーメッセージは明らかです。 –

答えて

1

あなたはこの試してみてください:(outputはそれを使用しています)

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はJSONからの読み取り時に使用されているものです(inputはこれを使用しています)とWritesはJSONへの書き込みの際に使用されるものです。彼らは一緒にFormatと呼ばれるものを形成します。あなたのコードでcaseクラスを使用しているので、play-jsonメソッドを使ってこれらのReads/Writes/Formatsを自動生成することができます。

+0

フィールド 'publicationName'は' pubTitle'と 'abstract'を' pubAbstract'と書かなければならないと考えています。つまり、フィールドの元のタイトルの名前を変更し、最終的なJSONに新しいタイトルの値を保存する必要があります。だからこそ私は読書を使いました。 – Klue

+0

@Klue更新されたソリューションをお試しください。 –

+0

Scalaのどのバージョンを使用していますか?私はこのエラーを2.11.4で受け取りました: 'Error:(122,46)は、以前のバージョンのScala暗黙的なvalでコンパイルされたマクロを展開できませんcreatorFormat = Json.format [Creator]' – Klue

関連する問題