【问题标题】:Java - Remove Fields from a JSON String recursively without POJOsJava - 在没有 POJO 的情况下递归地从 JSON 字符串中删除字段
【发布时间】:2018-11-09 11:59:38
【问题描述】:

如何递归地从 JSON 字符串中删除一些具有指定名称的字段?

例如,我想从以下 JSON 中删除字段“secondName”:

输入:

{
    "name" : "abc",
    "secondName": "qwe",
    "add" : "abcd",
    "moreDetails" : {
        "secondName": "qwe",
        "age" : "099"
    }
}

输出:

{
    "name" : "abc",
    "add" : "abcd",
    "moreDetails" : {
        "age" : "099"
    }
}

我必须从许多具有不同结构/架构的不同 JSON 中删除一些字段,因此我将无法对 POJO 进行反序列化/序列化。

【问题讨论】:

    标签: java json jackson gson


    【解决方案1】:

    Gson 将任何有效的 Json 反序列化为 LinkedTreeMap,例如:

    LinkedTreeMap<?,?> ltm = new Gson().fromJson(YOUR_JSON, LinkedTreeMap.class);
    

    然后就是做一些递归方法来进行清理:

    public void alterEntry(Entry<?, ?> e) {
        if(e.getValue() instanceof Map) {
            alterMap((Map<?, ?>) e.getValue());
        } else {
            if(e.getKey().equals("secondName")) { // hard coded but you see the point 
                e.setValue(null); // we could remove the whole entry from the map
                                  // but it makes thing more complicated. Setting null
                                  // achieves the same.
            }
        }
    }
    
    public void alterMap(Map<?,?> map) {
        map.entrySet().forEach(this::alterEntry);
    }
    

    用法:

    alterMap(ltm);
    

    【讨论】:

      【解决方案2】:

      您可以尝试将 JSON 存储为 JSONObject,使用 jsonObject.names() 遍历键并使用 jsonObject.remove(key) 删除条目。

      【讨论】:

      【解决方案3】:

      如果您知道架构和层次结构,您可以执行以下操作:

      JsonObject jsonObj= gson.fromJson(json, JsonObject.class); jsonObj.getAsJsonObject("moreDetails").remove("secondName"); System.out.println(jsonObj.getAsString());

      更多信息请参考Remove key from a Json inside a JsonObject

      否则,您需要编写一个动态函数,该函数将检查 JSON 对象的每个元素,并尝试在其中找到 secondName 元素并将其删除。

      所以在这里考虑,因为您有多个嵌套对象,那么您需要编写一个函数,该函数将遍历每个元素并检查其类型,如果它再次 jsonObject 递归或迭代地调用相同的方法来检查当前元素,在每次检查您还需要验证密钥,如果它与必须删除的密钥匹配,那么您可以将其删除并继续。

      有关如何检查 JSON 值类型的提示,请参阅How to check the type of a value from a JSONObject?

      【讨论】:

        猜你喜欢
        • 2011-10-20
        • 2015-08-06
        • 2013-02-05
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2019-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多