当前位置: 首页 > 知识库问答 >
问题:

在将泛型JSON再次写入JSON之前,清除其中的空字段

麹鸿煊
2023-03-14

我的函数需要获取一个可以表示任何类型JSON对象的输入String,清理空字段并将其转换回String。

给定此输入JSON,我希望删除字段:

String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : \"\"}";

我试图与< code>Jackson和这篇文章合作,得到了这个:

  private static void jacksonConvert(String inputJSON) throws IOException{
    ObjectMapper mapper = new ObjectMapper();
    mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); // tried each of the 3 options. Non of them worked
    mapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    Object jacksonObj = mapper.readValue(inputJSON, Object.class);
    String json = mapper.writeValueAsString(jacksonObj);
    System.out.println(json);  // {"brand":"Mercedes","doors":""}  why "doors" is here?
}

然而,字段在输出中不断出现...

我错过了什么?

共有2个答案

爱炯
2023-03-14

发现了这个伟大的工作示例,我将在这里复制给后代。

STACIE博客的一个小调整是我更新了

      else if (value instanceof ArrayNode) {
            ret.set(key, removeEmptyFields((ArrayNode)value));
        }

要捕获并删除空数组,请执行以下操作:

     else if (value instanceof ArrayNode) {
            if (value.size() > 0){
                ret.set(key, removeEmptyFields((ArrayNode)value));
            }
        }

完整的工作代码是这样的:

public static String removeEmptyElements(String json){

    try{

        ObjectMapper mapper = new ObjectMapper();
        ObjectNode before = mapper.readValue(json, ObjectNode.class);
        ObjectNode after = removeEmptyFields(before);

        String afterString = mapper.writeValueAsString(after);
        return afterString;
    }catch(JsonProcessingException e){
        log.error("Error while cleaning json: {}", e.getMessage());
        return json;
    }
}


private static ObjectNode removeEmptyFields(final ObjectNode jsonNode) {
    ObjectNode ret = new ObjectMapper().createObjectNode();
    Iterator<Map.Entry<String, JsonNode>> iter = jsonNode.fields();

    while (iter.hasNext()) {
        Map.Entry<String, JsonNode> entry = iter.next();
        String key = entry.getKey();
        JsonNode value = entry.getValue();

        if (value instanceof ObjectNode) {
            Map<String, ObjectNode> map = new HashMap<String, ObjectNode>();
            map.put(key, removeEmptyFields((ObjectNode)value));
            ret.setAll(map);
        }
        else if (value instanceof ArrayNode) {
            if (value.size() > 0){
                ret.set(key, removeEmptyFields((ArrayNode)value));
            }
        }
        else if (value.asText() != null && !value.asText().isEmpty()) {
            ret.set(key, value);
        }
    }

    return ret;
}


private static ArrayNode removeEmptyFields(ArrayNode array) {
    ArrayNode ret = new ObjectMapper().createArrayNode();
    Iterator<JsonNode> iter = array.elements();

    while (iter.hasNext()) {
        JsonNode value = iter.next();

        if (value instanceof ArrayNode) {
            ret.add(removeEmptyFields((ArrayNode)(value)));
        }
        else if (value instanceof ObjectNode) {
            ret.add(removeEmptyFields((ObjectNode)(value)));
        }
        else if (value != null && !value.textValue().isEmpty()){
            ret.add(value);
        }
    }

    return ret;
}
喻渊
2023-03-14

文档说明使用了这些枚举...

定义 Java Bean 的哪些属性要包含在序列化中

但是,如果您要序列化到Object,Jackson会将该对象实例化为Map。映射条目不被视为属性。因此Json.Include不适用。

编辑

关于删除空节点有一个现有的答案(如果你把它序列化为JsonNode,但没有一个答案让我感到特别高性能。

 类似资料:
  • 我从JSON文件中获取文本字段并将它们放入MySQL数据库。例如,SQL不关心表情符号代码\xF0\x9F\x98\x81。当尝试将此数据插入行时,它会显示“不正确的字符串值”。 我在这里有点不知所云,但我认为这是表情符号的UTF-8代码,在这里是笑脸。 我正在使用一个基于java的ETL客户端(Pentaho的Spoon)获取JSON数据并将其传递给MySQL数据库。 问题是,我不知道如何编写代

  • 问题内容: 我有一个提琴手设置,当我单击重置按钮时,它应该清除输入控件,这似乎有效,但是当输入 是否有我不了解的问题或东西。 当我设定 这似乎清除了其他输入类型,但未清除输入type =’url’。 有人知道为什么吗? 问题答案: 当您在input [type =“ url”]中没有有效值时,就会看到您遇到的问题。无效值仅停留在视图( 输入字段 )中,不会被推送到ng- model内部的scope

  • 问题内容: 我在Hibernate中有类似以下模型的内容: 我现在想将Person持久化到一个表,该表中所有person的地址都被序列化为JSON字符串并存储在Person表的一列中。数据库中的“个人”记录如下所示: 有没有办法使用Hibernate来做到这一点? 如果地址不是列表,我可以注册一个UserType来执行序列化。 我也不能使用JPA的@Converter,因为Hibernate实现不

  • 我正在尝试将数据框中的几个字段写入 JSON。数据框中的数据结构是 现在,我正试图将col1到col4字段转换为JSON,并为JSON字段命名 预期产出 我为此写了一个udf。 这就是我的结果 如您所见,它们没有分组。是否有使用UDF本身对这些行进行分组的方法。我是scala/Spark的新手,无法找到合适的udf。

  • 问题内容: 我正在努力解决这个问题。我有一个JSON文件,需要将其放到CSV中,如果结构是扁平的,没有深层嵌套的项目,就可以了。 但是在这种情况下,嵌套会使我烦恼。 我将如何以这种格式获取数据: 每个对象和对象中的每个种族? 我想这样输出到CSV: 所以首先我得到正确的密钥: 然后添加数据: 但是如何? 对于您熟练的forlooper来说,这应该是一个有趣的过程。 问题答案: 我只收集第一个对象的

  • 问题内容: 我正在使用VS2008Express在NET3.5SP1中构建winForms应用程序。我正在尝试使用System.Web.Script.Serialization库反序列化对象。 错误是:数组反序列化不支持类型’jsonWinForm.Category’。 干杯! 问题答案: 很高兴您发现自己的错误。如果您正在寻找用于JSON序列化的其他工具,则可能需要尝试JSON.Net。