如何使用JayWay JsonPath有条件地提取Json值?

n7taea2i  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(264)

我有以下JSON:

{
   "A":{
      "C":{
         "date":"2022-01-23"
      }
   },
   "B":{
      "D":{
         "date":"2022-01-24"
      }
   }
}

如果null不是null,我希望提取值$.A.C.date,否则我希望提取$.B.D.date
基本上,我想用JsonPath写一个if else表达式,但是,我没有设法使它工作。
这是我尝试过的方法:

String expression = "$.[?($.[?(@.A.C.date != null)].date || $.[?(@.B.D.date != null)].date)]";
JsonPath jsonPath = JsonPath.compile(expression);
String json = "...my JSON...";
Object extractedValue = jsonPath.read(json);
System.out.println(extractedValue);

......但我得到的输出只是一个空数组:[].
我也试过这个:

"$.[?($.[?(@.A.C.date != null)].A.C.date || $.[?(@.B.D.date != null)].B.D.date)]"

......但是输出是一个包含所有元素的列表(因为两种情况下条件都匹配),然而我认为编写.A.C.date只提取了date,而不是所有内容:

[
    {"A":{"C":{"date":"2022-01-23"}},
    "B":{"D":{"date":"2022-01-24"}}}
]

有人有什么想法吗?我在网上找不到任何类似的东西。
这是我使用的依赖关系:

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>
ctehm74n

ctehm74n1#

以下是使用com.jayway.jsonpath的可能解决方案

import com.jayway.jsonpath.JsonPath;

import java.util.List;

class Scratch {
    public static void main(String[] args) {
        JsonPath jsonPath = JsonPath.compile("$.*.*[?(@.date != \"null\")].date");
        List<String> read = jsonPath.read("{\n" +
                "   \"A\":{\n" +
                "      \"C\":{\n" +
                "         \"date\":\"2022-01-23\"\n" +
                "      }\n" +
                "   },\n" +
                "   \"B\":{\n" +
                "      \"D\":{\n" +
                "         \"date\":\"2022-01-24\"\n" +
                "      }\n" +
                "   }\n" +
                "}");
        System.out.println(read.get(0));
    }
}

它获取所有非空日期,然后打印第一个。

bfhwhh0e

bfhwhh0e2#

你可以考虑另一个库 Josson 来做这项工作。
https://github.com/octomix/josson

Josson josson = Josson.fromJsonString(
    "{" +
    "   \"A\":{" +
    "      \"C\":{" +
    "         \"date\":\"2022-01-23\"" +
    "      }" +
    "   }," +
    "   \"B\":{" +
    "      \"D\":{" +
    "         \"date\":\"2022-01-24\"" +
    "      }" +
    "   }," +
    "   \"E\":{" +
    "      \"F\":{" +
    "         \"date\":null" +
    "      }" +
    "   }" +
    "}");
String date = josson.getString("coalesce(A.C.date, B.D.date)");
System.out.println(date);
date = josson.getString("coalesce(E.F.date, B.D.date)");
System.out.println(date);
date = josson.getString("*.*.date[isNotNull()]");
System.out.println(date);
date = josson.getString("*().date[isNotNull()]");
System.out.println(date);
JsonNode node = josson.getNode("**.**.date[isNotNull()]*");
System.out.println(node.toString());

产出

2022-01-23
2022-01-24
2022-01-23
2022-01-23
["2022-01-23","2022-01-24"]

相关问题