java - Jodd:不要序列化空对象

标签 java json serialization jodd

目前我们正在使用 JODD lib 来进行 JSON 序列化。但它总是序列化空对象。我希望将对象非空对象序列化为 Json 字符串。我们怎样才能做到这一点?

Expecting:
{payload={app={id=xxx, version=0, hash=asdf, riskData={}}}}
--->
{"payload":{"app":{"id":"xxx","version":0,"hash":"asdf"}}} // not to show riskdata.

我们在 Jodd 3.7.1 中使用 JsonSerializer。 有什么帮助吗?

我们使用 Jodd 的场景是我们尝试序列化嵌入的日志映射对象。

/* inside this Map, there could be several embedded objects. */
/* ie. {payload={app={id=xxx, version=0, hash=asdf, riskData={}}}} */
Map<String, Object> log; 

由于此映射是从 JSON 字符串反序列化的,因此我们无法使用任何注释来标记空字段。 我们希望使用 JsonSerializer 将此 Map 对象序列化为 JSON 字符串,并排除任何具有空值的字段,例如空 map (riskData) 或空列表。

我昨天深入研究了代码。并找到了一个可能的解决方案,那就是扩展默认的 JsonSerializers 如:

public class NonEmptyMapSerializer extends MapJsonSerializer {
    @Override
    public void serializeValue(JsonContext jsonContext, Map<?, ?> map) {
        // If Map is empty. Skip it.
        if (map.isEmpty()) return;
        super.serializeValue(jsonContext, map);
    }
}
/*-----When initiating a JsonSerializer-----*/
logAllSerializer = new JsonSerializer().withSerializer(Map.class, new NonEmptyMapSerializer());

其他类型相同。

这个解决方案正确吗?它会导致任何意想不到的行为吗?或者您能提供其他更好的解决方案吗? 我可以找到一个选项: .excludeNulls(true) 但仅排除 NULL 字段。是否有隐藏选项“excludeEmpty”?

非常感谢!

最佳答案

对于 null 值,已经有一个 excludeNulls 标志:

String json = new JsonSerializer().excludeNulls(true).serialize(map);

此值将忽略所有 null 值。

新标志(刚刚提交)用于空值:excludeEmpty()。它可以按照您的预期使用:

json = new JsonSerializer().excludeNulls(true).excludeEmpty(true).serialize(map);

最后,您可以使用新的回调进行更多控制,例如:

json = new JsonSerializer().excludeNulls(true).onValue(value -> {
        if (value instanceof Map) {
            if (((Map)value).isEmpty()) {
                return new EmptyJsonSerializer();
            }
        }
        return null;
    }).serialize(map);

关于java - Jodd:不要序列化空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371662/

相关文章:

java - Java中下划线字体的常数值是多少?

java - 如何安装 Maven2 插件?

objective-c - 统计 JSON、NSArray

c# - 将 json 反序列化为包含字典的强类型对象

java - 使用@理解套接字路径(抽象套接字)

java - 马文。运行测试时跳过插件执行

Java如何获取JsonObject中包含JSONArray的特定值的集合(列表)

python - 使用 python 从 CSV 文件创建具有以下结构的 json 文件

javascript - 通过 D3 的 .attr 分配的多个类不在序列化 (serializeToString) 字符串中

c# - 如何在具有多个根的 C# 中反序列化 XML?