Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.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
Java 使用JayWay JSONPath在不同深度提取多个JSON对象 处境 我有一个JSON 我试图获取数组中具有某些特定嵌套对象的每个元素。困难的是,其中一些对象嵌套在不同的深度 我使用的是JayWay JsonPath,我的代码与_Java_Jsonpath - Fatal编程技术网

Java 使用JayWay JSONPath在不同深度提取多个JSON对象 处境 我有一个JSON 我试图获取数组中具有某些特定嵌套对象的每个元素。困难的是,其中一些对象嵌套在不同的深度 我使用的是JayWay JsonPath,我的代码与

Java 使用JayWay JSONPath在不同深度提取多个JSON对象 处境 我有一个JSON 我试图获取数组中具有某些特定嵌套对象的每个元素。困难的是,其中一些对象嵌套在不同的深度 我使用的是JayWay JsonPath,我的代码与,java,jsonpath,Java,Jsonpath,这是在我们的平台上使用的,这是一个电子表格,集成了已知的web服务(以及您的私有API) 特殊情况(可测试) 考虑以下源JSON,我只想返回包含嵌套对象B、C和G的数组元素。G的深度与B和C不同 下面您可以看到返回的来源和2个选项 源JSON [ { "A":"val1", "B":"val2", "C":"val3", "D":{ "E":[ { "

这是在我们的平台上使用的,这是一个电子表格,集成了已知的web服务(以及您的私有API)

特殊情况(可测试) 考虑以下源JSON,我只想返回包含嵌套对象B、C和G的数组元素。G的深度与B和C不同

下面您可以看到返回的来源和2个选项

源JSON

[  
   {  
      "A":"val1",
      "B":"val2",
      "C":"val3",
      "D":{  
         "E":[  
            {  
               "F":"val4"
            }
         ],
         "G":[  
            {  
               "H":"val5",
               "I":"val6",
               "J":"val7"
            }
         ]
      }
   },
   {  
      "A":"val8",
      "B":"val9",
      "C":"val10",
      "D":{  
         "E":[  
            {  
               "F":"val11"
            }
         ],
         "G":[  
            {  
               "H":"val12",
               "I":"val13",
               "J":"val14"
            }
         ]
      }
   },
   {  
      "A":"val15",
      "B":"val16"
   },
   {  
      "A":"val8",
      "B":"val9",
      "C":"val10",
      "D":{  
         "E":[  
            {  
               "F":"val11"
            }
         ]
      }
   }
]
预期回报选项1

[
   {
      "B":"val2",
      "C":"val3",
      "G":[
         {
            "H":"val5",
            "I":"val6",
            "J":"val7"
         }
      ]
   },
   {
      "B":"val9",
      "C":"val10",
      "G":[
         {
            "H":"val12",
            "I":"val13",
            "J":"val14"
         }
      ]
   }
]
预期回报选项2

[
   {
      "B":"val2",
      "C":"val3",
      "D":{
         "E":[
            {
               "F":"val4"
            }
         ],
         "G":[
            {
               "H":"val5",
               "I":"val6",
               "J":"val7"
            }
         ]
      }
   },
   {
      "B":"val9",
      "C":"val10",
      "D":{
         "E":[
            {
               "F":"val11"
            }
         ],
         "G":[
            {
               "H":"val12",
               "I":"val13",
               "J":"val14"
            }
         ]
      }
   }
]
我在哪里
  • 我可以通过查询
    $…['B','C','D']
我尝试提取B、C和G,但以下所有查询均失败:

  • $…['B','C','G']
    :返回null
  • $..['B','C',['D'].['G']].
    :仅返回G中的对象
同样,我使用的是JayWay JsonPath,我的代码工作原理与之完全相同


提前感谢

您可以解决此问题,将JayWay设置为默认的\u PATH\u LEAF\u to \u NULL配置(如官方文档中所述:),然后应用NULL比较评估:

像这样:

$.[?(@.A != null && @.B != null && @.D != null &&  @.D.G != null)]
或者这个:

$.[?((@.A != null && @.B != null) && ((@.D != null &&  @.D.G != null) || (@.G != null)))]
对于将默认路径设置为空,您应该更改默认配置:

Configuration conf = Configuration.defaultConfiguration();
Configuration conf2 = conf.addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL);
注意:如果您使用的是传统版本的jayway,则比较运算符无法正常工作,要获取更多信息,请参阅

我测试了这个解决方案,效果很好:

使用以下输入对进行了测试:

[  
   {  
      "A":"val1",
      "B":"val2",
      "C":"val3",
      "D":{  
         "E":[  
            {  
               "F":"val4"
            }
         ],
         "G":[  
            {  
               "H":"val5",
               "I":"val6",
               "J":"val7"
            }
         ]
      }
   },
   {  
      "A":"val8",
      "B":"val9",
      "C":"val10",
      "D":{  
         "E":[  
            {  
               "F":"val11"
            }
         ],
         "G":[  
            {  
               "H":"val12",
               "I":"val13",
               "J":"val14"
            }
         ]
      }
   },
   {  
      "A":"val15",
      "B":"val16"
   },
   {  
      "A":"val8",
      "B":"val9",
      "C":"val10",
      "D":{  
         "E":[  
            {  
               "F":"val11"
            }
         ]
      }
   }
]
结果是:

[
   {
      "A" : "val1",
      "B" : "val2",
      "C" : "val3",
      "D" : {
         "E" : [
            {
               "F" : "val4"
            }
         ],
         "G" : [
            {
               "H" : "val5",
               "I" : "val6",
               "J" : "val7"
            }
         ]
      }
   },
   {
      "A" : "val8",
      "B" : "val9",
      "C" : "val10",
      "D" : {
         "E" : [
            {
               "F" : "val11"
            }
         ],
         "G" : [
            {
               "H" : "val12",
               "I" : "val13",
               "J" : "val14"
            }
         ]
      }
   }
]


如果您在这方面需要任何进一步的帮助,请告诉我。

我一直在尝试一些不同的方法,我认为一个更简单的表达式可以解决这个问题:

$.*[?(@.B && @.C && @.D.G)]
除默认配置外,不需要任何特殊配置(根据在上完成的实验,并得出以下结果:

[
   {
      "A" : "val1",
      "B" : "val2",
      "C" : "val3",
      "D" : {
         "E" : [
            {
               "F" : "val4"
            }
         ],
         "G" : [
            {
               "H" : "val5",
               "I" : "val6",
               "J" : "val7"
            }
         ]
      }
   },
   {
      "A" : "val8",
      "B" : "val9",
      "C" : "val10",
      "D" : {
         "E" : [
            {
               "F" : "val11"
            }
         ],
         "G" : [
            {
               "H" : "val12",
               "I" : "val13",
               "J" : "val14"
            }
         ]
      }
   }
]

你怎么看?

我发现了一个小问题:-将
默认路径叶函数激活为空的问题是,即使路径不存在,其他函数也会返回空值。例如:在Json```[{“foo”:“foo1”,“bar”:“bar1”},{“foo”:“foo2”}``查询“$[*].bar”和“$…bar”将返回``[“bar1”,null]``我想要的地方``[“bar1”]``是否有一个查询+配置可以解决这两个问题?-对[B,C,D.G](或[B,C,…G]中的现有路径进行匹配;和-不为
任何查询
搜索
返回空值?实际上@dromualdo,您的查询就快到了,但它不会检查属性是否存在,而是检查属性是否不为空。这是不同的。例如,在上面的JSON上,如果您使用[0].D.B=null,我正在查找的JsonPath将返回2个对象[0]和[1]-都有B、C和..G,并且它只返回[1],因为[0].B.G存在,但[0]。B.G=null.perfect!这就是我正在查找的!