2014-01-29 69 views
2

我想僅從以下JSON共同路徑前綴JSON讀取

{ 
    "field": "feed", 
    "value": { 
    "item": "post", 
    "verb": "add", 
    "post_id": 1234568567515, 
    "sender_id": 10200718414514 
    } 
} 

閱讀「價值」這個:

case class Value (
    item: String, 
    verb: String, 
    itemId: Long, 
    senderId: Long 
) 

的讀取[超值]看起來是這樣的:

implicit val valueReads: Reads[Value] = (
    (__ \ "item").read[String] and 
    (__ \ "verb").read[String] and 
    (__ \ "post_id").read[Long] and 
    (__ \ "sender_id").read[Long] 
) (Value) 

我如何指定公共父節點「價值」爲所有路徑中不重複的全是它牛逼讀取他放置像(__ \「value」\「item」),(__ \「value」\「verb」)等?

回答

1

此代碼似乎工作:

implicit val valuereads = (__ \ "value").read { 
    ((__ \ "item").read[String] and 
    (__ \ "verb").read[String] and 
    (__ \ "post_id").read[Long] and 
    (__ \ "sender_id").read[Long] 
    )(Value.apply _) 
} 
0

不知道它是你在找什麼,但如果你想跳過手動編寫Reads對象,你可以使用宏。但是對於這種情況,您應該有父級案例類,它將包含兩個字段:fieldvalue

所以它會是這樣的:

case class Value (
    item: String, 
    verb: String, 
    itemId: Long, 
    senderId: Long 
) 

case class MyClass(field: String, value: Value) 


implicit val myClassReads = Json.reads[MyClass] 
implicit val valueReads = Json.reads[Value] 

所以在最後,你可以從MyClass對象讓你value

+0

是啊,這本來是很容易,但問題是我不感興趣的「場」,我想值爲解析整個JSON的結果。我的情況類似於[this](http://stackoverflow.com/questions/18122175/scala-play-json-reads),因爲對我而言,「value」鍵是阻礙任何事情發生的,並且不會攜帶任何有用的信息,就像這個問題的「商業」鍵。 – Yar