Play Scala找不到类型(String,String)的Json反序列化程序。尝试对此类型实现隐式读取或格式

Play Scala找不到类型(String,String)的Json反序列化程序。尝试对此类型实现隐式读取或格式,scala,playframework,Scala,Playframework,这些与Scala一起使用的Json序列化程序快把我逼疯了 我读过几十篇文章、教程和文档。尝试了四种不同的实现读/写/格式重写的方法,但均无效 因此,我放弃了自定义类型,决定使用uber simple: def suggest = Action(parse.json) { request => request.body.validate[(String, String)].map { case (suggestion, categories) =>

这些与Scala一起使用的Json序列化程序快把我逼疯了

我读过几十篇文章、教程和文档。尝试了四种不同的实现读/写/格式重写的方法,但均无效

因此,我放弃了自定义类型,决定使用uber simple:

  def suggest = Action(parse.json) {
    request =>
      request.body.validate[(String, String)].map {
        case (suggestion, categories) => Ok("You suggested " + suggestion + " for categories " + categories)
      }.recoverTotal {
        e => BadRequest(JsError.toFlatJson(e))
      }
  }
然后错误又回来了,就像主题中提到的那样

我真的需要为这样一个基本的主体提供一个定制的读/写/格式实现吗

示例输入主体可以是:

{"suggestion":"add generics", "categories":"request;language;updates"}
我遗漏了什么简单的东西?

因此我添加了以下内容:

  implicit val rds = (
    (__ \ 'suggestion).read[String] and
    (__ \ 'categories).read[String]
  ) tupled
这似乎奏效了


奇怪的是,这真的是最好的方法吗?如果要序列化/反序列化的类型很多,那么代码似乎很多。

播放!为您提供了许多使用Json的方法。从代码的外观来看,您正在走元组之路。它本质上允许您将Json转换为元组。您还使用了“reads”,其缺点是无法获得精确的错误报告(即:如果传递了无效的json,您会知道它无效……但您不一定知道它为什么无效)。如果需要更多的错误处理,则需要开始使用“验证”方法(详细信息如下:)

另一种方法是将Json映射到case类,如下所示:

import play.api.libs.json._

case class MyClass(
  suggestion: String,
  categories: String
)

object MyClass {
  implicit val readsMyClass: Reads[MyClass] = new Reads[MyClass] {
    def reads(json: JsValue): JsResult[MyClass] = {
      for {
        suggestion <- (json \ "suggestion").validate[String]
        categories <- (json \ "categories").validate[String]
      } yield MyClass(json,categories)
    }
  }
}
import play.api.libs.json_
案例类MyClass(
建议:字符串,
类别:字符串
)
对象MyClass{
隐式val readsMyClass:读取[MyClass]=新读取[MyClass]{
def读取(json:JsValue):JsResult[MyClass]={
为了{

建议如果您想要默认行为“序列化所有字段”,那么JsonInception可以正常工作。