我正在尝试对JSON中的Option [String]字段进行编组和取消编组.对于我的用例,None值应该被封送为"null".这是我的代码:
import org.scalatest.{FlatSpec, Matchers}
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
case class Person(
id: Int,
firstName: Option[String],
lastName: Option[String]
)
object Person {
implicit lazy val personFormat = (
(__ \ "id").format[Int] and
(__ \ "first_name").format[Option[String]] and
(__ \ "last_name").format[Option[String]]
)(Person.apply, unlift(Person.unapply))
}
class PersonSpec extends FlatSpec with Matchers {
"When Person instance is marshaled None fields " should
"be serialized as \"null\" values" in {
val person = Person(1, None, None)
import Person._
val json = Json.toJson(person)
println(json) …
Run Code Online (Sandbox Code Playgroud) 在以下示例中(scala 2.11和play-json 2.13)
val j ="""{"t":2.2599999999999997868371792719699442386627197265625}"""
println((Json.parse(j) \ "t").as[BigDecimal].compare(BigDecimal("2.2599999999999997868371792719699442386627197265625")))
Run Code Online (Sandbox Code Playgroud)
输出为-1
。他们不应该平等吗?在打印解析的值时,它会打印四舍五入的值:
println((Json.parse(j) \ "t").as[BigDecimal])
给 259999999999999786837179271969944
我需要将一个 Json 字段保存为我的 Play 框架模型的一列。我在 DAO 中的表解析器是
class Table(tag: Tag) extends Table[Model](tag, "tablename") {
implicit val configFormat = Json.format[Config]
// Fields ...
def config = column[Config]("config", O.SqlType("JSON"))
// Fields ...
}
Run Code Online (Sandbox Code Playgroud)
Config
在 Play Model 文件夹中的 Model 中定义为一个案例类,并有他的伴生对象。此对象的字段是 Int、Double 或 String
case class Config ( // fields )
object Config {
implicit val readConfig: Reads[Config] = new Reads[Config]
for {
// fields
} yield Config(// fields)
implicit val configFormat = Json.format[Config]
}
Run Code Online (Sandbox Code Playgroud)
问题是由于这个错误我无法编译
Error:(28, 37) could not find implicit value …
Run Code Online (Sandbox Code Playgroud) 我有一组从一个特征继承的case对象,如下所示:
sealed trait UserRole
case object SuperAdmin extends UserRole
case object Admin extends UserRole
case object User extends UserRole
Run Code Online (Sandbox Code Playgroud)
我想将其序列化为JSON,我只使用了Format机制:
implicit val userRoleFormat: Format[UserRole] = Json.format[UserRole]
Run Code Online (Sandbox Code Playgroud)
但不幸的是,编译器不满意,它说:
No unapply or unapplySeq function found
Run Code Online (Sandbox Code Playgroud)
我的案例对象出了什么问题?
我有一个定义的递归类:
case class SettingsRepository(id: Option[BSONObjectID],
name: Option[String],
children: Option[List[SettingsRepository]])
Run Code Online (Sandbox Code Playgroud)
使用JSON隐式格式如下:
implicit val repositoryFormat = Json.format[SettingsRepository]
Run Code Online (Sandbox Code Playgroud)
如何解决此编译错误?:
No implicit format for Option[List[models.practice.SettingsRepository]] available.
In /path/to/the/file.scala:95
95 implicit val repositoryFormat = Json.format[SettingsRepository]
Run Code Online (Sandbox Code Playgroud)
我试图定义一个懒惰的读/写/格式包装器没有任何成功......任何人都知道一个干净的方法来做到这一点?
任何帮助将不胜感激;
先感谢您.
使用 scala play-json 库,如何拒绝包含未使用字段的 JsonObject?当我的 api 用户拼错一个字段或提供一个我会忽略的额外字段时,我想给出一个错误。在 java 版本中,我看到提到了DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
,但在 Scala 版本中没有看到。
这是我想要的单元测试:
import org.scalatest._
import play.api.libs.json.{JsError, JsSuccess, Json}
case class MyStruct(a: Int, b: String)
object MyStruct {
import play.api.libs.functional.syntax._
import play.api.libs.json._ // Combinator syntax
implicit val writes: Writes[MyStruct] = Json.writes[MyStruct]
implicit val reads: Reads[MyStruct] = Json.reads[MyStruct]
}
class MyStructTest extends FlatSpec with Matchers {
"MyStruct reader" should "read json" in {
val x = Json.parse("{\"a\": 3, \"b\": \"hi\"}").validate[MyStruct]
x should be(
JsSuccess(
MyStruct(
a = 3,
b …
Run Code Online (Sandbox Code Playgroud) 我有一个与HTTP GET请求对应的空案例类:
case class GetFoo() extends MyQueryRequest {
// ...
}
Run Code Online (Sandbox Code Playgroud)
每个消息都有一个伴随对象,描述了它的隐式JSON编写器和阅读器:
object GetFoo extends MyImplicitJsonProvider[GetFoo] {
implicit val write = Json.writes[GetFoo]
implicit val read = Json.reads[GetFoo]
}
Run Code Online (Sandbox Code Playgroud)
但是,因为GetFoo
没有参数,所以没有办法(de)序列化它:
Unapply of object
GetFoo
没有参数.你在使用空的案例类吗?
将伪布尔变量注入构造函数的解决方法GetFoo
,但这是一个kludge.我想将GetFoo
(de)serializable作为一个空的JSON对象.我怎样才能做到这一点?
由于GET请求不发送数据,因此如果读取器/写入器被使用则抛出异常会更好,因为请求不应该被写入或读取,但是扩展类需要.
我的设计依赖于GetX
类扩展MyQueryRequest
和扩展的GetX
伴随对象MyImplicitJsonProvider[GetX]
.
上下文
我有一个案例类,它是层次结构中的一个项目,它引用自己是这样的:
case class Node(
name: String,
children: Option[Seq[Node]] = None
)
Run Code Online (Sandbox Code Playgroud)
我想要一个PlayJson Format
.
通常,您可以这样做:
implicit lazy val formatter = Json.format[MyCaseClass]
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
为什么?
PlayJson使用Scala宏Format
为case类生成一个,它将遍历所有字段,当它到达字段时children
,它将查找Node
尚未构造的现有格式化程序,以编译错误结束:
No implicit format for Option[Seq[Node]] available.
[error] implicit lazy val formatter = Json.format[Node]
Run Code Online (Sandbox Code Playgroud)
问题
什么是最好的方法来解决这个问题?
这是PlayJson格式宏的已知问题吗?
我正在使用 Play 的 WSClient 与第三方服务进行交互
request = ws.url(baseUrl)
.post(data)
.map{ response =>
response.json.validate[MyResponseClass]
Run Code Online (Sandbox Code Playgroud)
响应可能是 aMyResponseClass
也可能是ErrorResponse
类似{ "error": [ { "message": "Error message" } ] }
是否有解析类或错误的典型方法?
我应该做这样的事情吗?
response.json.validateOpt[MyResponseClass].getOrElse(response.json.validateOpt[ErrorClass])
Run Code Online (Sandbox Code Playgroud) 我正在使用 Play Framework 来构建 API,但需要使用仅使用 Json4s 的库来执行一些验证和转换操作。
到目前为止,我唯一能够开始工作的是转换为字符串并使用目标库进行解析:
import org.json4s._
import org.json4s.jackson.JsonMethods._
import play.api.libs.json._
val playJson: JsValue = Json.parse(compact(render(json4sJson)))
val json4sJson: JValue = parse(Json.stringify(playJson))
Run Code Online (Sandbox Code Playgroud)
但这显然是低效的,并且会产生丑陋的代码。有没有更好的办法?