我正在尝试将一些相对简单的模型序列化为json.例如,我想得到json表示:
case class User(val id: Long, val firstName: String, val lastName: String, val email: Option[String]) {
def this() = this(0, "","", Some(""))
}
Run Code Online (Sandbox Code Playgroud)
我是否需要使用适当的读写方法编写自己的格式[用户],还是有其他方法吗?我看过https://github.com/playframework/Play20/wiki/Scalajson,但我还是有些迷茫.
json scala playframework playframework-2.0 playframework-json
我设法用自定义约束实现表单验证,但现在我想用JSON数据做同样的事情.
如何将自定义验证规则应用于JSON解析器?
示例:客户端的POST请求包含用户名(username
),我不仅要确保此参数是非空文本,还要确保此用户实际存在于数据库中.
// In the controller...
def postNew = Action { implicit request =>
request.body.asJson.map { json =>
json.validate[ExampleCaseClass] match {
case success: JsSuccess[ExampleCaseClass] =>
val obj: ExampleCaseClass = success.get
// ...do something with obj...
Ok("ok")
case error: JsError =>
BadRequest(JsError.toFlatJson(error))
}
} getOrElse(BadRequest(Json.obj("msg" -> "JSON request expected")))
}
// In ExampleCaseClass.scala...
case class ExampleCaseClass(username: String, somethingElse: String)
object ExampleCaseClass {
// That's what I would use for a form:
val userCheck: Mapping[String] = nonEmptyText.verifying(userExistsConstraint)
implicit val …
Run Code Online (Sandbox Code Playgroud) 我想在通过JSON读取构造对象时使用常量值.
例如,该类将是:
case class UserInfo(
userId: Long = -1,
firstName: Option[String] = None,
lastName: Option[String] = None
)
Run Code Online (Sandbox Code Playgroud)
阅读将是:
implicit val userRead: Reads[UserInfo] = (
(JsPath \ "userId").read[Long] and
(JsPath \ "firstName").readNullable[String] and
(JsPath \ "lastName").readNullable[String]
)(UserInfo.apply _)
Run Code Online (Sandbox Code Playgroud)
但我不想在JSON对象中指定userId的值.我将如何编写Reads,以便始终在UserInfo对象中创建-1的值而不在正在读取的JSON对象中指定它?
我认识一个之间的区别Monad
,并Applicative
是flatMap
可用的Monad
,但不是Applicative
.
如果这是真的,我对这些Scala Play JSON 文档感到困惑:
所以有趣的是JsResult [A]是一个monadic结构,可以用于这种结构的经典函数:
flatMap [X](f:A => JsResult [X]):JsResult [X]
等等
但是,然后文件继续说:
请注意,JsResult [A]不仅仅是Monadic而且是Applicative,因为它累积了错误.这个累积的特性使得JsResult [T]使得用于理解不是很好,因为你只会得到第一个错误,而不是全部错误.
因为,据我所知,一个for-comprehension
是语法糖flatMap
,怎么可能JsResult
是Applicative
和Monad
?
这是我的搜索对象:
package models.helper
import play.api.libs.json.Format
import play.api.libs.json.JsValue
import play.api.libs.json.JsObject
import play.api.libs.json.JsString
case class Search (name: String, `type`:String){
implicit object SearchFormat extends Format[Search] {
def reads(json: JsValue): Search = Search(
(json \ "name").as[String],
(json \ "type").as[String]
)
def writes(s: Search): JsValue = JsObject(Seq(
"name" -> JsString(s.name),
"type" -> JsString(s.`type`)
))
}
}
Run Code Online (Sandbox Code Playgroud)
我在尝试使用WS调用web服务时尝试使用此类:
val search = response.json.as[Search]
Run Code Online (Sandbox Code Playgroud)
但scala编译器一直在抱怨这条线:
找不到类型models.helper.Search的Json反序列化器.尝试为此类型实现隐式读取或格式.
谁能告诉我我做错了什么?
我有一个示例代码如下.
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 Retailer(firstName:String,lastName:String,email:String,mobileNo:String,password:String)
case class Business(name:String,preferredUrl:String,businessPhone:String,retailer:Retailer)
object JsonTest {
val jsonValue = """
{
"business":
{
"name":"Some Business Name",
"preferredUrl":"someurl",
"businessPhone":"somenumber",
"retailer":
{
"firstName":"Some",
"lastName":"One",
"email":"someone@somewhere.com",
"mobileNo":"someothernumber",
"password":"$^^HFKH*"
}
}
}
"""
def printJson ={
implicit val rltRds = (
(__ \ "firstName").read[String] ~
(__ \ "lastName").read[String] ~
(__ \ "email").read[String] ~
(__ \ "mobileNo").read[String] ~
(__ \ "password").read[String]
)(Retailer)
implicit val bsnsRds = (
(__ \ "name").read[String] ~
(__ \ …
Run Code Online (Sandbox Code Playgroud) 我在Play 2.3中有以下JSON阅读器:
import play.api.libs.json._
import play.api.libs.json.Reads._
val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength(3))
Run Code Online (Sandbox Code Playgroud)
并且编译器给了我错误
diverging implicit expansion for type play.api.libs.json.Reads[M]
starting with method ArrayReads in trait DefaultReads
Run Code Online (Sandbox Code Playgroud)
如果我使用implicit val
我得到的
ambiguous implicit values:
both value uuidReads in trait DefaultReads of type => play.api.libs.json.Reads[java.util.UUID]
and value airportSearchReads in object AirportSearch of type => play.api.libs.json.Reads[String]
match expected type play.api.libs.json.Reads[M]
Run Code Online (Sandbox Code Playgroud)
我如何让它工作?
json scala playframework playframework-2.0 playframework-json
我定义了以下读取:
import org.joda.time.DateTime;
implicit val userInfoRead: Reads[UserInfo] = (
(JsPath \ "userName").readNullable[String] and
] (JsPath \ "startDate").readNullable[DateTime]
(UserInfo.apply _)
Run Code Online (Sandbox Code Playgroud)
传递以下JSON对象:
"userInfo" : {
"userName": "joeuser",
"startDate": "2006-02-28"
}
Run Code Online (Sandbox Code Playgroud)
当我验证此数据时,出现以下错误:
(/startDate,List(ValidationError(validate.error.expected.jodadate.format,WrappedArray(yyyy-MM-dd))))))
Run Code Online (Sandbox Code Playgroud)
关于格式化中我缺少的任何建议吗?
我正在尝试为类型Map [Int,Long]写一个json读取组合器
到目前为止我有这个:
implicit val mapWrites = Json.writes[Map[Int, Long]]
implicit val mapReads: Reads[Map[Int, Long]] = (
// ???
) // ?
Run Code Online (Sandbox Code Playgroud)
我不确定这是如何工作的,我尝试做(Map [Int,Long] .apply但是apply方法不可用.
寻找一些帮助来编写这个Reads组合器.
我正在使用play.api.libs.json._库.我有这种Scala类.我需要以Json格式读/写这个类.因为Timestamp没有隐式的读/写器.我必须提供自己的.不幸的是,我尝试了几种方式.你能告诉我它是怎么做的吗?提前致谢!
case class Event(id: Long, startTime: Option[java.sql.Timestamp] = None, endTime: Option[java.sql.Timestamp] = None)
Run Code Online (Sandbox Code Playgroud)
我想按照Json格式POST/GET
{
"id": 1,
"startTime": "2011-10-02 18:48:05.123456",
"endTime": "2011-10-02 20:48:05.123456"
}
Run Code Online (Sandbox Code Playgroud)