gpt4 book ai didi

JSONPath表达式从条件数组中获取值或仅获取第一个值

转载 作者:行者123 更新时间:2023-12-04 11:02:02 29 4
gpt4 key购买 nike

鉴于JSON的结构如下:

{
"name":"Some Guy",
"emails":[
{
"description":"primary",
"status":"UNVERIFIED",
"email":"first@first-email.com"
},
{
"description":"home",
"status":"VERIFIED",
"email":"second@second-email.com"
},
{
"description":"away",
"status":"VERIFIED",
"email":"third@third-email.com"
}
]
}

我希望 JSONPath expression获得状态为 VERIFIED的第一封电子邮件,如果没有,则只需获取数组中的第一封电子邮件。因此,在上述示例中,结果将为 second@second-email.com。给出以下示例:
{
"name":"Some Guy",
"emails":[
{
"description":"primary",
"status":"UNVERIFIED",
"email":"first@first-email.com"
},
{
"description":"home",
"status":"UNVERIFIED",
"email":"second@second-email.com"
}
]
}

结果将是 first@first-email.com

JSONPath表达式可以做到这一点吗?

最佳答案

您实际上有2个JSONPath表达式,仅当第一个(第一个已验证的电子邮件)未返回任何内容时,才应评估第二个(第一个电子邮件),因此我认为您无法在一个单一的时间内同时对它们进行求值表达。

不过,您可以一个接一个地应用它们:

public static String getEmail(String json) {
Configuration cf = Configuration.builder().options(Option.SUPPRESS_EXCEPTIONS).build();
DocumentContext ctx = JsonPath.using(cf).parse(json);
List<String> emails = ctx.read("$.emails[?(@.status == 'VERIFIED')].email");
if (!emails.isEmpty()) {
return emails.get(0);
}
return ctx.read("$.emails[0].email");
}

如果电子邮件数组为空,则感谢 option ctx.read("$.emails[0].email")SUPPRESS_EXCEPTIONS将返回null而不抛出异常。

如果您事先不知道路径数:
public static String getEmail(String json, String[] paths) {
Configuration cf = Configuration.builder().options(Option.ALWAYS_RETURN_LIST, Option.SUPPRESS_EXCEPTIONS).build();
DocumentContext ctx = JsonPath.using(cf).parse(json);
for (String path : paths) {
List<String> emails = ctx.read(path);
if (!emails.isEmpty()) {
return emails.get(0);
}
}
return null;
}

option ALWAYS_RETURN_LIST表示返回类型是一个列表,即使结果为零或零也是如此。

关于JSONPath表达式从条件数组中获取值或仅获取第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41471244/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com