2016-04-25 39 views
1

我使用Play的Reads组合语法来读取相当巨大的JSON结构。这个效果很好,只有一个行业例外:播放JSON读取Combinator语法:访问原始JsValue?

implicit val reads: Reads[SomeEntity] = (
    (__ \ "name").read[String] and 
    // a lot more to read, omitted... 
    ... and 
    (__ \ "settings").read[Seq[Setting]](settingsReads(<name here>)) 
)(...) 

正如你可以在上面看到,自定义Reads[Setting](这里:settingsReads)需要JSON结构的name场 - 这是第2行,但读同一名称我怎么能访问它?可以使用(JsValue \ "name").as[String]手动完成,但因此需要“原始”JsValue,而使用combinator语法时则不是这种情况。或者我错了?有更简单的方法吗?

编辑: TL; DR:我想给实体的 -STRING传递给settingsReads方法。

+0

是的,你的权利。您可以在Reads中使用没有JsValue的'name'值。你可以用Json例子来优化你的问题,并描述你想如何使用'name'值。 –

+0

很抱歉,如果不够清楚。我想要做的是将_name_-String传递给获取设置所需的读取。换句话说:第5行的方法调用需要第2行的字符串。'settingsReads'的定义是'def settingsReads(name:String):读取[Setting]'。 – fxlae

回答

4

你读[SomeEntity]:

implicit val reads: Reads[SomeEntity] = (
    (__ \ "name").read[String] and 
    // a lot more to read, omitted... 
    ... and 
    (__ \ "name").read[String].flatMap(name => 
    (__ \ "settings").read[Seq[Setting]](settingsReads(name)) 
    ) 
)(...)