错误消息:尝试为此类型

时间:2016-07-09 16:01:15

标签: json scala playframework

我有以下json字符串。在scala中,我想提取一些字段并将它们保存在一个新的json中。

  

{ “查询”: “DOI:10.1186 / s13612-016-0045-3”, “结果”:[{ “总”: “1”, “启动”: “1”, “pageLength”:“10 “}]” 记载 “:[{” 标识符 “:” DOI:10.1186 / s13612-016-0045-3" , “URL”:[{ “格式”: “”, “平台”: “”,“值“:”http://dx.doi.org/10.1186/s13612-016-0045-3 “}],” 标题 “:” 技术   与反思:情绪与记忆机制   幸福感“‘创造者’:[{‘创造者’:”康拉德,   Artie“},{”创造者“:”塔克,西蒙“},{”创造者“:”鹤,   约翰“},{”创造者“:”惠特克,史蒂夫“},”publicationName“:”心理学   的   幸福感”, “ISSN”: “2211年至1522年”, “OpenAccess的”: “真”, “journalid”: “13612”, “DOI”: “10.1186 / s13612-016-0045-3”, “发行人” : “斯普林格”, “publicationDate”: “2016年6月15日”, “体积”: “6”, “号码”: “1”, “问题类型”: “”, “topicalCollection”: “”, “startingPage” : “1”, “版权”:“©2016   该   作者(S) “ ”流派“: ”OriginalPaper“, ”抽象“:” AbstractBackgroundWe   报告a   ... “}],” 小面 “:[{” 姓名 “:” 受试者 “ ”值“:[{ ”值“:” 生物   心理学 “ ”算“: ”1“},{ ”值“:” 生   心理学 “ ”算“: ”1“},{ ”值“: ”神经心理学“, ”数“: ”1“},{ ”值“:” 正   心理学 “ ”算“: ”1“},{ ”值“: ”心理学“, ”算“: ”1“},{ ”值“:” 质量   生命   研究 “ ”计数“ 为 ”1“}]},{ ”名称“: ”酒吧“, ”值“:[{ ”值“:” 心理学   的   幸福感”, “算”: “1”}]},{ “名”: “年”, “值”:[{ “值”: “2016”, “数”: “1”}]}, { “名”: “国家”, “值”:[{ “值”:“美国   状态”, “计数” 为 “1”},{ “值”: “USA”, “计数” 为 “1”}]},{ “名称”: “类型”, “值”:[{ “值” : “报”, “计数” 为 “1”}]},{ “名称”: “关键字”, “值”:[{ “值”: “情感”, “计数” 为 “1”},{”值 “:” 内存”, “计数” 为 “1”},{ “值”: “心情”, “计数” 为 “1”},{ “值”: “反射”, “计数” 为 “1” },{ “值”: “爱莲说”, “算”: “1”},{ “值”:“技术   介   反射”, “计数” 为 “1”},{ “值”: “幸福”, “计数” 为 “1”}]}]}

特别是我想得到以下新的json对象(即提取字段“creators”,“publicationName”和“abstract”,相应地重命名):

  

{“creators”:[{“creator”:“Konrad,Artie”},{“creator”:“Tucker,   西蒙“},{”创造者“:”鹤,约翰“},{”创造者“:”惠特克,   Steve“},”pubTitle“:”心理学“   幸福“,”pubAbstract“:”AbstractBackgroundWe报告......“}

这是我当前的代码,但我的错误消息显示为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)

1 个答案:

答案 0 :(得分:1)

你应该试试这个:

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期间使用的内容(output使用它) 。他们一起形成了一种叫做Format的东西。由于您在代码中使用了case类,因此可以使用play-json方法自动生成这些读/写/格式。