首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala -如何使用json-path拆分列表Json节点的所有列表

Scala -如何使用json-path拆分列表Json节点的所有列表
EN

Stack Overflow用户
提问于 2020-07-11 20:53:48
回答 1查看 180关注 0票数 0

我有一个Json,我想从其中选择List Json的List,其中instance可以是List中的多个。如果给定列表/数组的索引号,我们可以很容易地使用json-path来选择。但是在一个大文件中,我们不知道总共会有多少个实例,我们也不需要丢失任何数据。因此必须以动态方式检查实例数量,并为所有内部列表节点挑选单独的json。此外,还必须为所有数据创建relation_path。

谁能建议如何检查json节点是否为Array/List (例如:2 Drive),以及有多少嵌套列表对象可用,如1驱动器中的2个Partition和2驱动器中的1个Partition。这些数字在json-path代码中不是固定的。

列表Json的输入列表:

代码语言:javascript
复制
{"Start":{"HInfo":{"InfoId":"650FEC74","Revision":"5.2.0.51","Drive":[{"InfoId":"650FEC74","Index":0,"Name":"Drive0","Partition":[{"InfoId":"650FEC74","DriveID":"F91B1F36","Index":0},{"InfoId":"650FEC74","DriveID":"F91B1F36","Index":1}]},{"InfoId":"650FEC74","Index":1,"Name":"Drive1","Partition":{"InfoId":"650FEC74","DriveID":"3F275869","Index":0}}]}}}

Json的输出列表:

代码语言:javascript
复制
[{"Partition":[{"InfoId":"650FEC74","DriveID":"F91B1F36","Index":0},{"InfoId":"650FEC74","DriveID":"F91B1F36","Index":1}],"relation_tree":"Start/HInfo/Drive/Drive-1/Partition"},{"Partition":{"InfoId":"650FEC74","DriveID":"3F275869","Index":0},"relation_tree":"Start/HInfo/Drive/Drive-2/Partition"}]

我尝试使用json-path,但这并不合适,因为我在这里手动提供索引号,这在所有情况下都是不可能的,因为索引号可以是0到任何。

代码语言:javascript
复制
val jsonString = """{"Start":{"HInfo":{"InfoId":"650FEC74","Revision":"5.2.0.51","Drive":[{"InfoId":"650FEC74","Index":0,"Name":"Drive0","Partition":[{"InfoId":"650FEC74","DriveID":"F91B1F36","Index":0},{"InfoId":"650FEC74","DriveID":"F91B1F36","Index":1}]},{"InfoId":"650FEC74","Index":1,"Name":"Drive1","Partition":{"InfoId":"650FEC74","DriveID":"3F275869","Index":0}}]}}}"""
  val jsonStr: JsValue = Json.parse(jsonString)
    var pruneJson1 = (__ \ "Partition").json.copyFrom((__ \ "Start" \ "HInfo" \ "Drive" \ (0) \ "Partition").json.pick)
    val finalPartitionPrune1 = Option(jsonStr.transform(pruneJson1)).get.get.as[JsObject] + ("relation_tree" -> Json.toJson("Start"+"/"+"HInfo"+"/"+"Drive"+"/"+"Drive-1"+"/"+"Partition"))

    println(finalPartitionPrune1)

  var pruneJson2 = (__ \ "Partition").json.copyFrom((__ \ "Start" \ "HInfo" \ "Drive" \ (1) \ "Partition").json.pick)
  val finalPartitionPrune2 = Option(jsonStr.transform(pruneJson2)).get.get.as[JsObject] + ("relation_tree" -> Json.toJson("Start"+"/"+"HInfo"+"/"+"Drive"+"/"+"Drive-2"+"/"+"Partition"))

   println(finalPartitionPrune2)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-17 17:27:46

这是我能想到的最简单的解决方案:

代码语言:javascript
复制
val finalJson = Json.toJson(
  (jsonStr \ "Start" \ "HInfo" \ "Drive")
    .as[Seq[JsValue]]
    .map(jsValue => JsObject(Seq(
      "Partition" -> (jsValue \ "Partition").get,
      "relation_tree" -> JsString(s"Start/HInfo/Drive/Drive-${(jsValue \ "Index").get}/Partition")))))

基本上,它将所有驱动器读取为JsValues序列,然后将它们映射到具有所需格式的JsObjects。它使用驱动器的索引值来创建relation_tree值,因此如果缺少该值,它将失败。作为另一种选择,您可以使用zipWithIndex方法将自己的索引添加到序列中。作为最后一步,它将序列转换回JsValue

以下是zipWithIndex版本:

代码语言:javascript
复制
val finalJson =   Json.toJson(
  (jsonStr \ "Start" \ "HInfo" \ "Drive")
    .as[Seq[JsValue]]
    .zipWithIndex
    .map{ case (jsValue, index) => JsObject(Seq(
      "Partition" -> (jsValue \ "Partition").get,
      "relation_tree" -> JsString(s"Start/HInfo/Drive/Drive-$index/Partition")))
    })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62849404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档