这可能是一个新手的问题,我真的很抱歉,但我无法找到它任何地方。上述代码和输出
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)
)
}
}