在类型(String,String)中找到Scala No Json反序列化器.尝试为此类型实现隐式读取或格式

Ste*_*ner 13 scala playframework

Play with Scala中的这些Json序列化器让我疯狂.

我已阅读了数十篇帖子以及教程和文档.尝试了四种不同的实现读/写/格式覆盖的方法,但都无济于事.

所以我退出了自定义类型,并决定简单:

  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))
      }
  }
Run Code Online (Sandbox Code Playgroud)

如上所述,错误会再次出现.

我是否真的需要为这样的基本体提供自定义的读/写/格式实现?

样本输入主体可以是:

{"suggestion":"add generics", "categories":"request;language;updates"}
Run Code Online (Sandbox Code Playgroud)

我错过了什么简单的事情?

sth*_*mps 6

玩!为您提供了很多与Json合作的方法.从代码的外观来看,你正沿着Tuple路走下去.这本质上允许您将Json转换为元组.您还使用"读取",其缺点是您没有获得精确的错误报告(即:如果通过无效的json,您将知道其无效......但您不一定知道它为何无效).如果您想要更多错误处理,那么您需要开始使用'validate'方法(详情请参阅:http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators).

另一种方法是将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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这似乎是很多代码所以Play 2.1引入了Json'Inception',我还没有尝试过(http://www.playframework.com/documentation/2.1.1/ScalaJsonInception).

最后,如果您想要Json验证但不需要编组/解组案例类,那么您可以尝试"沿海岸到海岸"方法.这将使您的所有json保持为JsObject类型,但仍然为您提供验证.在此示例代码:https://github.com/mandubian/play2-json-demo/blob/master/json-coast-to-coast/app/controllers/Application.scala

希望这可以帮助.


Ste*_*ner 2

所以我添加了这个:

  implicit val rds = (
    (__ \ 'suggestion).read[String] and
    (__ \ 'categories).read[String]
  ) tupled
Run Code Online (Sandbox Code Playgroud)

这似乎有效。

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