我有下面的json字符串。在scala中,我想提取一些字段并将它们保存在一个新的json中。
{“查询”:“doi:10.1186/s 13612-016-0045-3”,“结果”:{“总计”:“1”,“开始”:“1”,"pageLength":"10"},pageLength“url”:[{“格式”:“”,“平台”:“”,“值”:“http://dx.doi.org/10.1186/s13612-016-0045-3”},“标题”:“技术与反思:心情与记忆幸福机制”,“创造者”:{“创造者”:“康拉德,阿蒂”},{“创造者”:“塔克,西蒙”},{“创造者”:“克兰,约翰”},{“创作者”:“创作者”:“惠特克,史蒂夫”},“publicationName”:“幸福心理学”,"issn":"2211-1522",“开放存取”:“真”,“日记”:“13612”,“doi”:“10.1186/s 13612-016-0045-3”,“出版商”:“Springer”,"publicationDate":"2016-06-15",“卷”:“6”,“数字”:“1”,“问题类型”:“”,"topicalCollection":"","startingPage":"1",“版权”:“2016作者”,“体裁”:“OriginalPaper”,“抽象”:“AbstractBackgroundWe report a.}”,“面”:[{“名称”:“主体”、“价值”:{“价值”:“生物心理学”、“计数”}、{“价值”:“健康心理学”、“计数”:“1”}、{“价值”:“神经心理学”、“计数”、“1”}、{“价值”:“积极心理学”、“计数”、“1”}、{“价值”:“心理学”、“计数”:“1”}{“价值”:“生活质量研究”、“计数”、“1”}、{“名称”:“酒吧”、“价值观”:{“价值”:“幸福心理”、“计数”、“1”}、{“名称”:“年份”、“价值观”:{“价值”:“2016”、“计数”:“1”}}、{“名称”:“国家”、“价值观”:{“价值”:“美国”,“计数”:“1”},{“值”:“USA”,“计数”:“1”},{“名称”:“类型”,“值”:{“值”:“日记”,“计数”:“1”},{“名称”:“关键字”,“值”:{“值”:“情感”,“计数”:“1”},{“值”:“内存”,“计数”:“1”},{“值”},{“名称”:“关键字”,“值”:“情绪”“计数”:“1”},{“值”:“反射”,“计数”:“1”},{“值”:“联系”,“计数”:“1”},{“值”:“技术中介的反射”,“计数”:“1”},{“值”:“幸福”,“计数”:“1”}
特别是,我希望获得以下新的json对象(即提取字段"creators“、"publicationName”和“抽象”,并相应地将它们重命名为):
{“创作者”:{“创作者”:“Konrad,Artie"},{”创作者“:”Tucker,Simon"},{“创作者”:“Crane,John"},{”创建者“:”创建者“:”Whittaker,Steve"},“pubTitle”:“幸福心理学”,"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)
发布于 2016-07-09 17:16:43
你应该试试这个:
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方法自动生成这些读/写/格式。
https://stackoverflow.com/questions/38283664
复制相似问题