标签: play-json

Option [String]没有Json格式化程序?

我正在尝试对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)

json scala play-json

9
推荐指数
2
解决办法
4464
查看次数

为什么play-json在读取/解析时会失去精度?

在以下示例中(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

scala playframework play-json

9
推荐指数
1
解决办法
394
查看次数

Scala + Play Framework + Slick - Json 作为模型字段

我需要将一个 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)

json scala playframework slick play-json

7
推荐指数
1
解决办法
2666
查看次数

用于案例对象的Play Framework JSON格式

我有一组从一个特征继承的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)

我的案例对象出了什么问题?

scala playframework play-json

7
推荐指数
2
解决办法
2785
查看次数

带有递归类定义的Json隐式格式

我有一个定义的递归类:

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)

我试图定义一个懒惰的读/写/格式包装器没有任何成功......任何人都知道一个干净的方法来做到这一点?

任何帮助将不胜感激;

先感谢您.

recursion json scala playframework play-json

6
推荐指数
1
解决办法
1797
查看次数

如何在play-json scala中使用未使用的字段在json上失败?

使用 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)

json scala playframework play-json

5
推荐指数
0
解决办法
539
查看次数

如何使用play-json编写和读取空案例类?

我有一个与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].

serialization scala case-class play-json

5
推荐指数
1
解决办法
1482
查看次数

Scala PlayJson Cyclic Reference

上下文

我有一个案例类,它是层次结构中的一个项目,它引用自己是这样的:

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格式宏的已知问题吗?

json scala playframework-2.0 play-json

4
推荐指数
1
解决办法
251
查看次数

使用 Play WSClient 处理 JSON 错误响应

我正在使用 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)

error-handling scala playframework ws-client play-json

4
推荐指数
1
解决办法
2886
查看次数

如何在 play.api.libs.json.JsValue 和 org.json4s.JValue 之间进行转换

我正在使用 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)

但这显然是低效的,并且会产生丑陋的代码。有没有更好的办法?

scala playframework json4s play-json

3
推荐指数
1
解决办法
1951
查看次数