Play Framework Scala:是否有可能在键值对中获得可空值,如name:None



这可能是一个新手的问题,我真的很抱歉,但我无法找到它任何地方。上述代码和输出

Using Play Framework 2.3.9 (Scala)

// controller

object Products extends Controller {
    def list = Action {
        Ok(Json.obj("products" -> Product.all))
    }
}

// Model

case class Product(id: Long, name: Option[String])
object  Product {
    implicit val format: Format[Product] = Json.format[Product]
    def all = DB.withConnection { implicit c =>
        SQL("SELECT *   FROM    Products;").apply().map { row =>
            Product(
                id = row[Long]("id"),
                name = row[Option[String]]("name")
            )
        }.toList
    }
}

output generated:

{
    "products": [{
        "id": 1,
        "name": "test"
    }, {
       "id": 2
    }]
}

output wanted:

{
    "products": [{
        "id": 1,
        "name": "test"
    }, {
       "id": 2,
       "name": null
    }]
}

None是什么类型的json值?你是指字符串"None",还是json空值null ?无论如何,格式行:

implicit val format: Format[Product] = Json.format[Product]

为你创建一个自动json格式化程序,但你可以自己编写以任何自定义格式输出json,例如:

implicit val productWrites = new Writes[Product] {
  def writes(product:Product) = Json.obj(
    "id" -> product.id,
    "name" -> product.name
    )
}

将产生一个值null (JsNull),即"name" : null。对于像product (1,None)这样的产品。如下:

implicit val productWrites = new Writes[Product] {
  def writes(product:Product) = Json.obj(
    "id" -> product.id,
    "name" -> JsString(product.name.getOrElse("None"))
    )
}

将为name生成一个json字符串值,即"name":"None"。更多信息请访问play网站的相关页面。

您正在寻找的是像这样的Writes[Product]的实现;

object Product {
  implicit val writes = new Writes[Product] {
    def writes(p: Product): JsValue = Json.obj(
      "id" -> p.id,
      "name" -> p.name // will output null and not None (as in your question)
    )
  }
}

最新更新