【问题标题】:How can I return all the values except for a "null" one in a JSONObject?如何在 JSONObject 中返回除“null”值之外的所有值?
【发布时间】:2021-10-30 00:02:07
【问题描述】:

让我提供一些背景信息:

我有一个 org.json JSONObject,它包含这个 JSON 对象的所有值,取自 API。

"socialMedias" : {
    "TWITTER" : "[twitter url]",
    "YOUTUBE" : "[youtube url]",
    "INSTAGRAM" : "[instagram url]",
    "FACEBOOK" : null,
    "VIMEO" : "[vimeo url]",
    "LINKEDIN" : "[linkedin url]"
}

然而,在对 API 的这些调用之一中,只有一个值为 null,但相同的值并不总是为 null,并且可以有多个值为 null ;让我说明一下我的意思:

"socialMedias" : {
    "TWITTER" : "[twitter url]",
    "YOUTUBE" : null,
    "INSTAGRAM" : null,
    "FACEBOOK" : "[facebook url]",
    "VIMEO" : "[vimeo url]",
    "LINKEDIN" : "[linkedin url]"
}

以上是 API 可以返回的内容。另一个:

"socialMedias" : {
    "TWITTER" : null,
    "YOUTUBE" : null,
    "INSTAGRAM" : null,
    "FACEBOOK" : null,
    "VIMEO" : null,
    "LINKEDIN" : null
}

从字面上看,JSONObject 中的每个值都可以为空!

回到问题: 我如何能够检查 JSONObject 的哪些值为 null,并且只返回那些不为 null 的值;所以对于我拥有的第一个代码块,代码将返回TWITTER, YOUTUBE, INSTAGRAM, VIMEOLINKEDIN URL,并排除FACEBOOK,因为那个的值为null。

此 API 返回用户已链接到其帐户的社交媒体的 JSONObject,如果用户未添加值或不清楚,则将其设为 null。

我在 Java 17 中使用最新版本的 org.json 库来执行此操作。提前感谢您的帮助,不胜感激!

编辑:我猜我只是在这篇文章中没有使用我的大脑。 我现在意识到我可以遍历 socialMedias 对象中的每个值,然后将所有不为空的值添加到列表中......对不起!

【问题讨论】:

  • 你为什么在乎?该对象的客户端(用户)仍然必须确定存在/存在哪些可能性。忽略空值有什么问题?听起来你是在为自己工作。
  • 杰克逊很容易,org.json 我不确定你能做到。
  • @JimGarrison 我只想返回不为空的值;我正在使用 API 将消息返回到不同的服务器,如果有空值,该 API 将抛出一个合适的。 ://
  • @JoãoDias 从未使用过 Jackson,只使用过 org.json。此外,我在 org.json 中编写了大量的代码,更改所有内容需要几个月的时间。 ://
  • 这可能是原始问题。我从未使用过org.json,但在我看来,Jackson 更易于使用且更强大。例如参考stackoverflow.com/questions/42641301/…

标签: java json maven org.json java-17


【解决方案1】:
    JSONObject socialMedias = new JSONObject(apiResponse).getJSONObject("socialMedias");
    JSONArray socialMediaArray = socialMedias.toJSONArray(socialMedias.names());
    socialMediaArray.toList().stream().filter(v -> v != null);

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
  • 嘿,这似乎不起作用;我得到一个java.util.Stream.ReferencePipeline$2@ 加上最后的一堆数字。我试图过滤这些值并执行 #toString 以将 Stream 转换为字符串,但我得到了那个错误。我做错了吗?
  • 私有静态流 buildResponse() { JSONObject apiJsonResponse = null;尝试 { JSONObject socialMedias = new JSONObject(apiResponse).getJSONObject("socialMedias"); JSONArray socialMediaArray = socialMedias.toJSONArray(socialMedias.names()); return socialMediaArray.toList().stream().filter(v -> v != null); } catch (JSONException ex) { } } public static void main(String... args) { buildResponse().forEach(System.out::println); }
  • 如果有帮助,我在这里使用 java 15。对我来说很好,这是输出 .m2/repository/org/json/json/20210307/json-20210307.jar JsonParser [facebook url] [linkedin url] [vimeo url] [twitter url]
  • 用 java 17 试试这个,也许那里有些不同。将发送更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多