2013-01-08 30 views
11

我使用了新的遊戲2.1-RC1框架,我有了一個選項[]字段的一類,像這樣:如何處理JSON解析可選字段中發揮2.1

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Reads._ 
import play.api.libs.json.Writes._ 
import play.api.libs.json.Format._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

object Test { 
    implicit val testFormat = (
    (__ \ "name").format[String] and 
    (__ \ "value").format[Option[String]] 
)(Test.apply, unlift(Test.unapply)) 
    def fromJson(js: String): Test = { 
    Json.fromJson[Test](Json.parse(js)).fold(
     valid = { t => t}, 
     invalid = { e => { 
      val missingField = (e(0)._1).toString.substring(1) 
      val badJs = js.trim 
      val newJs = badJs.substring(0, badJs.length()-1)+",\""+missingField+"\":null}" 
      fromJson(newJs) 
     }} 
    ) 
    } 
} 

我希望能夠處理忽略可選「值」數據的JSON字符串,例如

val y = """{"name":"someone"}""" 

(編輯問題) 我可以重寫JSON字符串(而笨拙地)作爲驗證步驟顯示,但 有一個簡單的模式,我可以用它來爲丟失的可選字段提供無?請注意,這種重寫不適用於嵌套結構,或者無法簡單追加缺失字段的地方。

回答

6

你可以簡單地這樣做:

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

implicit val testFormat = Json.format[Test] 

def hoge = Action(Json.parse.json) { request => 
    Json.fromJson[Test](request.body) 
    ... 
} 
+0

唯一的問題是,json不是來自請求,而是來自websocket。 – NickStoughton

+0

@NickStoughton'Iteratee.foreach [JsValue](event => Json.fromJson [Test](event))' – sndyuk

+0

@NickStoughton JFYI https://github.com/playframework/Play20/blob/master/samples/scala/websocket -chat/app/models/ChatRoom.scala – sndyuk

3

OK ......所以,答案很簡單。使用

fomatOpt() 

爲可選字段。所以測試格式化器現在看起來像這樣:

import play.api.libs.json._ 
import play.api.libs.json.util._ 
import play.api.libs.json.Reads._ 
import play.api.libs.json.Writes._ 
import play.api.libs.json.Format._ 
import play.api.libs.functional.syntax._ 

case class Test(name: String, value: Option[String]) 

object Test { 
    implicit val testFormat = (
    (__ \ "name").format[String] and 
    (__ \ "value").formatOpt[String] 
)(Test.apply, unlift(Test.unapply)) 

    def fromJson(js: String): Test = { 
    Json.fromJson[Test](Json.parse(js)).fold(
     valid = { t => t}, 
     invalid = { e => { 
     println("BAD JSON!") 
     null 
     }} 
    ) 
    } 
} 
+2

當使用scala宏進行注入讀/寫/格式時,情況如何?例如在你的情況下,我們可以只寫 '隱式val testFormat = Json.format [測試]' 如何在這種情況下管理可選的JSON值? – visionary