Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在play 2.1中处理JSON解析中的可选字段_Scala_Playframework_Playframework 2.0 - Fatal编程技术网

Scala 如何在play 2.1中处理JSON解析中的可选字段

Scala 如何在play 2.1中处理JSON解析中的可选字段,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我正在使用新的Play 2.1-RC1框架,我有一个类,它有一个Option[]字段,类似这样: import play.api.libs.json._ import play.api.libs.json.util._ import play.api.libs.json.Reads._ import play.api.libs.json.Writes._ import play.api.libs.json.Format._ import play.api.libs.functional.synt

我正在使用新的Play 2.1-RC1框架,我有一个类,它有一个Option[]字段,类似这样:

import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
import play.api.libs.json.Format._
import play.api.libs.functional.syntax._

case class Test(name: String, value: Option[String])

object Test {
  implicit val testFormat = (
    (__ \ "name").format[String] and
    (__ \ "value").format[Option[String]] 
  )(Test.apply, unlift(Test.unapply))
  def fromJson(js: String): Test = {
    Json.fromJson[Test](Json.parse(js)).fold(
        valid   = { t => t},
        invalid = { e => {
          val missingField = (e(0)._1).toString.substring(1)
          val badJs = js.trim
          val newJs = badJs.substring(0, badJs.length()-1)+",\""+missingField+"\":null}"
          fromJson(newJs)
        }} 
    )
  }
}
import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
import play.api.libs.json.Format._
import play.api.libs.functional.syntax._

case class Test(name: String, value: Option[String])

object Test {
  implicit val testFormat = (
    (__ \ "name").format[String] and
    (__ \ "value").formatOpt[String] 
  )(Test.apply, unlift(Test.unapply))

  def fromJson(js: String): Test = {
    Json.fromJson[Test](Json.parse(js)).fold(
      valid   = { t => t},
      invalid = { e => {
        println("BAD JSON!")
        null
      }} 
    )
  }
}
我希望能够处理省略可选“值”数据的JSON字符串,例如

val y = """{"name":"someone"}"""
(编辑问题) 我可以重写json字符串(相当笨拙),如验证步骤所示,但是
是否有一种更简单的模式可以用于为缺少的可选字段不提供任何内容?请注意,这种重写不适用于嵌套结构,也不适用于我不能简单地附加缺少的字段的任何地方。

您可以简单地执行以下操作:

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Test(name: String, value: Option[String])

implicit val testFormat = Json.format[Test]

def hoge = Action(Json.parse.json) { request => 
    Json.fromJson[Test](request.body)
    ...
}

好的。。。所以答案很简单。使用

fomatOpt()
用于可选字段。因此,测试格式化程序现在如下所示:

import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
import play.api.libs.json.Format._
import play.api.libs.functional.syntax._

case class Test(name: String, value: Option[String])

object Test {
  implicit val testFormat = (
    (__ \ "name").format[String] and
    (__ \ "value").format[Option[String]] 
  )(Test.apply, unlift(Test.unapply))
  def fromJson(js: String): Test = {
    Json.fromJson[Test](Json.parse(js)).fold(
        valid   = { t => t},
        invalid = { e => {
          val missingField = (e(0)._1).toString.substring(1)
          val badJs = js.trim
          val newJs = badJs.substring(0, badJs.length()-1)+",\""+missingField+"\":null}"
          fromJson(newJs)
        }} 
    )
  }
}
import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
import play.api.libs.json.Format._
import play.api.libs.functional.syntax._

case class Test(name: String, value: Option[String])

object Test {
  implicit val testFormat = (
    (__ \ "name").format[String] and
    (__ \ "value").formatOpt[String] 
  )(Test.apply, unlift(Test.unapply))

  def fromJson(js: String): Test = {
    Json.fromJson[Test](Json.parse(js)).fold(
      valid   = { t => t},
      invalid = { e => {
        println("BAD JSON!")
        null
      }} 
    )
  }
}

唯一的问题是json不是来自请求,而是来自websocket。@NickStoughton
Iteratee.foreach[JsValue](event=>json.fromJson[Test](event))
@NickStoughton JFYI谢谢!那有帮助!但是如果传入的JSON缺少格式化程序(读取器)期望的字段,则仍然存在问题。我已经更新了上面的示例以显示一种解决方法。使用scala宏注入读/写/格式时的情况如何?例如,在您的例子中,我们可以只编写
implicit val testFormat=Json.format[Test]
在这种情况下如何管理可选的Json值?