如何在 ObjectMapper 中忽略空对象“{}”而不是空字符串?

Ale*_*lin 3 java json jackson fasterxml

我需要序列化(忽略空对象(“{}”))可以包含任何内容的非结构化对象。

从版本 2.9.X FasterXML 改变了它的工作逻辑 (Include.NON_EMPTY)。在旧版本中,它按我的需要工作。但现在它也忽略了空字符串。

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
Run Code Online (Sandbox Code Playgroud)

假设我们有下一个 java 对象(为方便起见,它看起来像一个 JSON):

{
    "mapA": {},
    "listA": ["",
        {
            "emptyString": "",
            "string": "some text"
        },
        {}
    ],
    "emptyString": "",
    "mapB": {
        "emptyString": "",
        "mapC": {}
    }
}
Run Code Online (Sandbox Code Playgroud)

将其转换为 JsonNode:

   mapper.convertValue(/*our Object*/, JsonNode.class);
Run Code Online (Sandbox Code Playgroud)

所需的输出(再次为方便起见,它看起来像一个 JSON):

{
    "listA": ["",
        {
            "emptyString": "",
            "string": "some text"
        }
    ],
    "emptyString": "",
    "mapB": {
        "emptyString": ""
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lin 5

我用过Include.CUSTOM

    private static class ExludeEmptyObjects{
        @Override
        public boolean equals(Object o) {
            if (o instanceof Map) {
                return ((Map) o).size() == 0;
            }
            if (o instanceof Collection) {
                return ((Collection) o).size() == 0;
            }
            return false;
        }
    }

Run Code Online (Sandbox Code Playgroud)
   ObjectMapper mapper = new ObjectMapper();
   mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
   mapper.setDefaultPropertyInclusion(Value.construct(Include.NON_EMPTY, Include.CUSTOM, null, ExludeEmptyObjects.class));
Run Code Online (Sandbox Code Playgroud)