2014-01-29 71 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