从 JsonObject 内的 Json 中删除密钥

2022-09-01 12:57:11

我有如下所示的 JsonObject

{"status":"ACTIVE","accounts":{"email":"email@gmail.com","name":"Test"}}

如何通过使用类似java的东西从JsonObject中删除Json密钥“email”及其值jsonObj.remove("email")

JsonObj.removev 在我需要删除状态键时为我工作jsonObj.remove("status")

更新

一些更多的背景,这主要是用于测试休息端点。在我的测试中,我使用Builder模式创建了与有效负载匹配的java对象,然后使用GsonBuilder将java对象转换为Json,例如

import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
public class JsonConvertor() {
public static JsonObject convertToJsonObject(Object payload) {
GsonBuilder builder = new GsonBuilder();
return (JsonObject) builder.setFieldNamingPolicy(FieldNamingPolicy.Policy).
            create().toJsonTree(payload);
}}

如果我需要删除我使用的必填字段,JsonObj.remove(“key”)在由上述函数创建的Json Object上。


答案 1

如果Gson像Jackson(我假设是这样),你必须首先从根对象中获取“帐户”,然后删除成员“email”,例如:JsonObject

jsonObj.getAsJsonObject("accounts").remove("email");

或者 - 可能是首选方式 - 您将json对象映射到POJO(具有字段“状态”,“帐户”和“帐户”将指向另一个POJO),导航到帐户 - POJO并将“电子邮件”设置为空。然后,将根 POJO 重新格式化为 JSON,并应用省略具有空值的字段的设置。

编辑(评论中问题的答案):

简而言之,我不知道是否有内置功能,但它应该是可行的。

问题是,如果您只提供像等这样的密钥,您可能会遇到有多个密钥的情况,因此识别正确的密钥可能很困难。因此,最好提供密钥,并将“key”拆分为子表达式,然后使用部分遍历Json树,或者将Json转换为POJO并使用某些表达式语言(例如Java EL或OGNL)来遍历POJO。emailaccounts.email

如果要删除所有命名的属性,可以遍历整个 json 树,检查是否存在具有该名称的属性,如果是,则将其删除。email


答案 2

或者,您可以使用以下内容:

DocumentContext doc = JsonPath.parse(json);
doc.delete(jsonPath);

其中 和 是字符串。jsonjsonPath

Library: com.jayway.jsonpath.DocumentContext.