【问题标题】:Remove an empty element from JSON file with Jackson使用 Jackson 从 JSON 文件中删除一个空元素
【发布时间】:2015-06-18 13:45:16
【问题描述】:

我正在尝试从 JSON 文件中删除一个元素:

[  
         {  
            "Lorem Ipsum ":4,
         },
         {  
            "Lorem Ipsum ":5,
         },
         {  
            "keyToRemove": value,
         }
]

使用以下代码,我可以删除键和值:

for (JsonNode personNode : rootNode) {
    if (personNode instanceof ObjectNode) {
       if (personNode.has("keyToRemove")) {
          ObjectNode object = (ObjectNode) personNode;  
          object.remove("keyToRemove");
       }
    }
}

但我还有一个空括号:

[  
         {  
            "Lorem Ipsum ":4,
         },
         {  
            "Lorem Ipsum ":5,
         },
         {  
         }
]

如何删除它?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    您并没有移除整个对象,而是移除了其中的一个元素。

    object.remove("keyToRemove"); 
    

    将从您的 object 中删除一个元素 keyToRemove 。在这种情况下object 基本上是json object 而不是json array

    要删除整个对象,您不应该使用for loop。 您可以尝试改用Iterator

        Iterator<JsonNode> itr = rootNode.iterator();
    
        while(itr.hasNext()){
            JsonNode personNode = itr.next();
            if(personNode  instanceof ObjectNode){
               if (personNode.has("keyToRemove")) {
                 // ObjectNode object = (ObjectNode) personNode;  
                 // object.remove("keyToRemove");
                 itr.remove();
               }
            }
        };
    

    【讨论】:

      【解决方案2】:

      追求可重用性

      nafas 的答案似乎为您提供了解决此问题所需的信息。就像另一种方法一样:删除不需要的对象可能与单个用例相关联,因此将删除与反序列化分离可能是理想的。您可以按原样反序列化您的 JSON,然后在需要时过滤掉不需要的对象。

      创建一个代表您的 JSON 的对象

      与使用 JsonNode 相比,这样的对象将允许您将 JSON 转换为 Java 并以更正式的方式对数据执行操作。 不确定 Jackson 如何处理属性名称中的空格,这只是为了匹配给出的示例 JSON。

      public class CustomPojo {
          private final Integer keyToKeep;
          private final String keyToRemove;
      
          @JsonCreator
          public CustomPojo(@JsonProperty("Lorem Ipsum ") Integer keyToKeep,
                            @JsonProperty("keyToRemove") String keyToRemove) {
              this.keyToKeep = keyToKeep;
              this.keyToRemove = keyToRemove;
          }
      
          @JsonProperty("Lorem Ipsum ")
          public Integer getKeyToKeep() {
              return keyToKeep;
          }
      
          @JsonProperty("keyToRemove")
          public String getKeyToRemove() {
              return keyToRemove;
          }
      }
      

      添加删除不需要的对象的方法

      添加删除对象的方法将使删除与反序列化分离。假设您将 JSON 反序列化为资源中的数组。

      public class CustomPojoService {
          public static List<CustomPojo> removeUnwantedKeys(List<CustomPojo> customPojoArray) {
              return customPojoArray.stream().filter(
                      customPojo -> customPojo.getKeyToRemove() == null
              ).collect(Collectors.toList());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 2021-04-30
        • 2016-08-29
        • 1970-01-01
        • 2023-03-22
        • 2020-09-18
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        相关资源
        最近更新 更多