Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重头戏2.1-RC2:从JSON读取密钥_Json_Scala_Playframework_Playframework 2.0_Playframework 2.1 - Fatal编程技术网

重头戏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

我尝试将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): 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])