从 JsonObject 中删除 Json 中的键

31

我有以下类似的JsonObject

{"status":"ACTIVE","accounts":{"email":"email@gmail.com","name":"Test"}}
如何使用类似jsonObj.remove("email")的方式在Java中从JsonObject中删除Json键"email"及其值?
如果我需要删除状态键,则JsonObj.remove工作正常,如jsonObj.remove("status")
更新
更多背景信息, 这主要是用于测试REST端点。在我的测试中,我使用Builder模式创建了与有效负载匹配的Java对象,然后使用GsonBuilder将其转换为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);
}}
如果我需要删除必填字段,我会在上述函数创建的Json对象上使用JsonObj.remove("key")。

1
“accounts” 是一个对象本身,因此您的 “jsonObj” 应该指向该对象。此外,请考虑添加更多信息到您的问题中,因为我们不知道 “jsonObj” 的实际类型、使用哪个库、它指向什么等等。您在提问中付出的努力越多,越有人愿意帮助您。 - Thomas
你有一个与这个JSON匹配的Java对象吗? - melli-182
是的@melli-182,我有与JSON匹配的Java对象。 - Anoop Philip
@Thomas,我已经在问题中添加了更多信息。 - Anoop Philip
4个回答

49
如果Gson与Jackson类似(我这样假设),您需要首先从根对象中获取JsonObject“accounts”,然后删除成员“email”,例如像这样:
jsonObj.getAsJsonObject("accounts").remove("email");

或者 - 也许更好的方式 - 是将json对象映射到一个POJO(其中包含“status”、“accounts”字段和“accounts”指向另一个POJO),导航到accounts-POJO并在那里将“email”设为null。然后,重新格式化root POJO为JSON并应用忽略null值字段的设置。

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

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

问题在于,如果您只提供像email等键,可能会出现多个键的情况,因此识别正确的键可能很困难。因此,最好将关键字提供为accounts.email,将“key”拆分为子表达式,然后使用部分遍历Json树,或将Json转换为POJO并使用某些表达式语言(例如Java EL或OGNL)来遍历POJO。

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


jsonObj.getAsJsonObject("accounts").remove("email"); 已经完美地运行了。感谢 @Thomas。另一个相关的问题是,有没有更好的方法来确定要删除的键是主 Json 对象内部的键(如 'status')还是主 Json 对象内的 Json 对象中的键(如 'email')? - Anoop Philip
@AnoopPhilip 我会添加一篇编辑,因为这太多了,不适合评论。 - Thomas

4

或者,你可以使用以下代码:

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

其中 jsonjsonPath 均为字符串。

库: com.jayway.jsonpath.DocumentContext


1
import org.json.JSONObject

// define/initialize jsonObj
jsonObj.remove("field_key")

-1
另一种删除JSON键/值对的方法是使用JavaScript中的delete函数。
delete jsonObject.key1.subKey1;

测试数据:

var jsonObject = {
    key1: {
    subKey1: 'someText',
    subKey2: 'someText'
  },
  key2: 'anotherText'
};

console.log(jsonObject);

delete jsonObject.key1.subKey1;
delete jsonObject.key2;


console.log(jsonObject);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接