JSON Play Framework 未正确解析

JSON not being parsed correctly by Play Framework

我有以下代码,我正在使用它来尝试将一些 JSON 解析为 Scala 案例 class:

 val json =
    """{"hits": [
        {"created_at":"2016-02-01T15:01:03.000Z","title":"title","num_comments":778,"parent_id":null,"_tags":["story","author","story_11012044"],"objectID":"11012044","_highlightResult":{"title":{"value":"title","matchLevel":"full","matchedWords":["title"]},"author":{"value":"author","matchLevel":"none","matchedWords":[]},"story_text":{"value":"Please lead","matchLevel":"none","matchedWords":[]}}}
    ]}""".stripMargin

  val jsobj = Json.parse(json)
  val r = (JsPath \ "hits").read[Seq[HiringPost]](Reads.seq[HiringPost])
  val res: JsResult[Seq[HiringPost]] = r.reads(jsobj)
  println("result is: " + res)

这里还有一些隐含的转换:

case class HiringPost(date: String, count: Int, id: String )
object HiringPost {

  implicit val hiringPostFormat = Json.format[HiringPost]

  implicit val hiringWrites: Writes[HiringPost] = (
    (JsPath \ "date").write[String] and
    (JsPath \ "count").write[Int] and
    (JsPath \ "id").write[String]
  )(unlift(HiringPost.unapply))

  implicit val hiringReads: Reads[HiringPost] = (
    (JsPath \  "created_at").read[String] and
    (JsPath \  "num_comments").read[Int] and
    (JsPath \  "objectID").read[String]
  )(HiringPost.apply _)
}

但是我在尝试解析 JSON 时得到的响应是:

result is: JsError(List((/hits(0)/date,List(ValidationError(List(error.path.missing),WrappedArray()))), (/hits(0)/count,List(ValidationError(List(error.path.missing),WrappedArray()))), (/hits(0)/id,List(ValidationError(List(error.path.missing),WrappedArray())))))

我编写解析或隐式的方式有什么问题?

如果您有读取和写入,则不应定义 Format[HiringPost]。我很惊讶这不是隐式解析错误。去掉这一行:

implicit val hiringPostFormat = Json.format[HiringPost]

您还可以用宏 Json.writes[HiringPost]

替换琐碎的 Writes 隐式

如果您使用 ReadsWrites,则不需要 Formats

删除您的 implicit val hiringPostFormat = Json.format[HiringPost] 并在您的解析 class 中添加 import HiringPost._ 以将隐含函数置于范围内 - 它会起作用。