2016-11-10 5 views
0

これは初心者の質問かもしれませんが、私は本当にそれについて申し訳ありませんが、私はどこでもそれを見つけることができませんでした。記述されたコードと出力。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 
    }] 
} 
+1

'{" name ":None}'は無効ですJSON。 '{" name ":" None "}'は有効で、 '{" name ":null}' –

+0

@RhysBradburyありがとう、更新されました。 –

答えて

2

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":"None"のためのJSON文字列値を生成します。 relevant page on the play websiteから入手可能な詳細情報。

2

そうのような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) 
    ) 

    } 

} 
関連する問題