我有像下面的JsonObject
{"status":"ACTIVE","accounts":{"email":"email@gmail.com","name":"Test"}}
如何使用java中的jsonObj.remove("email")
之类的东西从JsonObject中删除Json密钥“email”及其值
如果我需要删除状态密钥jsonObj.remove("status")
更新
更多背景, 这主要用于测试休息终点。在我的测试中,我使用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”)所需的字段。
答案 0 :(得分:22)
如果Gson像Jackson一样(我假设是这样),你必须先从根对象中获取JsonObject
“帐户”,然后删除成员“email”,例如像这样:
jsonObj.getAsJsonObject("accounts").remove("email");
或者 - 可能是首选方式 - 您将json对象映射到POJO(具有“status”,“accounts”和“accounts”将指向另一个POJO的字段),导航到帐户-POJO并将“email”设置为null。然后,将根POJO重新格式化为JSON,并应用省略具有空值的字段的设置。
修改(回答评论中的问题):
为了缩短它,我不知道是否有内置功能,但它应该是可行的。
问题在于,如果您只提供email
等密钥,您可能会遇到有多个密钥的情况,因此识别正确的密钥可能很难。因此,最好将密钥提供为accounts.email
并将“密钥”拆分为子表达式,然后使用部件遍历Json树或将Json转换为POJO并使用某种表达式语言(例如Java EL)或OGNL)遍历POJO。
如果要删除名为email
的所有属性,只需遍历整个json树,检查是否存在具有该名称的属性,如果是,则将其删除。
答案 1 :(得分:0)
或者,您可以在下面使用:
DocumentContext doc = JsonPath.parse(json);
doc.delete(jsonPath);
json
和jsonPath
是字符串。