Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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
如何使用play framework 2的json路径解析从xml转换得不好的json?_Xml_Json_Scala_Deserialization_Playframework 2.1 - Fatal编程技术网

如何使用play framework 2的json路径解析从xml转换得不好的json?

如何使用play framework 2的json路径解析从xml转换得不好的json?,xml,json,scala,deserialization,playframework-2.1,Xml,Json,Scala,Deserialization,Playframework 2.1,我有一个表单的传入数据提要: { attributes: [ { name:"first", values=["1st"]}, { name:"second", values=["2a", "2b"]} ]} case class TheThing(first:String, second:List[String]) 我想将其解析为如下形式的case类: { attributes: [ { name:"first", values=["1st"]}, { name:"second",

我有一个表单的传入数据提要:

{ attributes: [
 { name:"first", values=["1st"]},
 { name:"second", values=["2a", "2b"]}
]}
case class TheThing(first:String, second:List[String])
我想将其解析为如下形式的case类:

{ attributes: [
 { name:"first", values=["1st"]},
 { name:"second", values=["2a", "2b"]}
]}
case class TheThing(first:String, second:List[String])

我看到的所有json path reads操作示例只涉及从一个节点到一个属性的直接映射,如何处理有多个节点的操作,以及在某些情况下从列表到奇点的转换?

因此,我提出的解决方案对性能密集型代码没有好处,但是,它为映射提供了一个干净的接口

object ThingReads {
  def reads(source:JsValue) = {
    val names:Seq[String] = (source \ "attributes" \\ "name").map(_.as[String])
    val values:Seq[JsValue] = source \ "attributes" \\ "values"
    val read = reads[TheThing] = (
      ( __ \ "first")(0).as[String] and
      ( __ \ "second").as[List[String]]
    )(TheThing.apply _)
    JsObject(names.zip(values)).as[TheThing](read)
  }
}
主要的缺点是需要将json树迭代两次,两次构建更好的json格式,然后在提取值时再次迭代

此外,如果在本例中,您的键值对集合属性中包含大量不相关的数据,那么您将为转换这些数据以及要提取的位付出代价

我会接受这个答案,因为它解决了问题,但我会继续回来看看是否有人能提供一个更好的解决方案我相信有一个在那里,我很想学习它