重头戏2.1-RC2:从JSON读取密钥
我尝试将web应用程序从Play 2.0.4迁移到Play 2.1-RC2 我有一个包含未知键列表的JSON数据(重头戏2.1-RC2:从JSON读取密钥,json,scala,playframework,playframework-2.0,playframework-2.1,Json,Scala,Playframework,Playframework 2.0,Playframework 2.1,我尝试将web应用程序从Play 2.0.4迁移到Play 2.1-RC2 我有一个包含未知键列表的JSON数据(key1,key2),如下所示: {description: "Blah", tags: [ key1: ["value1", "value2"], key2: ["value3"] ] } 我想将JSON中的数据存储在元标记列表中。在Play 2.0.4中,我使用了类似的内容来阅读标签-列表: def readMetatags(meta: JsObject): L
key1
,key2
),如下所示:
{description: "Blah",
tags: [
key1: ["value1", "value2"],
key2: ["value3"]
]
}
我想将JSON中的数据存储在元标记列表中。在Play 2.0.4中,我使用了类似的内容来阅读标签
-列表:
def readMetatags(meta: JsObject): List[Metatag] =
meta.keys.toList.map(x => Metatag(x, (meta \ x).as[List[String]])
现在我想使用新的Play 2.1-JSON-API(原型):
如何从JSON中读取键?这是一个解决方案,为
MetaTag
类提供了一个自定义读取器。read-just将JsValue
转换为JsObject
,该对象具有有用的字段集
方法
对于元标记
,宏inception可以完美地工作
对象应用程序扩展控制器{
案例类元标记(描述:字符串,标记:列表[MetaTag])
case类元标记(键:String,数据:List[String])
隐式val readMetaTag=Reads(js=>
JsSuccess(js.as[JsObject].fieldSet.map(标记=>
MetaTag(tag._1,tag._2.as[List[String]])).toList)
隐式val readMetaTags=Json.reads[MetaTags]
def索引=操作{
val json=json.obj(
“说明”->“你好,世界”,
“标签”->地图(
“键1”->序号(“键1a”、“键1b”),
“第2项”->序号(“第2A项”),
“键3”->序号(“键3A”、“键3B”、“键3C”))
val meta=json.as[MetaTags]
Ok(meta.tags.map(uu.data.mkString(“,”).mkString(“/”))
//键1A、键1B/键2A/键3A、键3B、键3C
}
}
太棒了!现在游戏2.1一切正常。非常感谢您的回答。
import play.api.libs.json._
import play.api.libs.functional.syntax._
object Metatags {
implicit val metatagsRead: Read[Metatags] = (
(JsPath \ "description").read[String] and
(JsPath \ "tags").read[List[Metatag]]
)(Metatags.apply _, unlift(Metatags.unapply _))
implicit val metatagRead: Read[Metatag] = (
JsPath().key. ?? read[String] and // ?!? read key
JsPath().values. ?? read[List[String]] // ?!? read value list
)(Metatag.apply _, unlift(Metatag.unapply _))
}
case class Metatags(description: String, tags: List[Metatag])
case class Metatag(key: String, data: List[String])