目前我们正在使用 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/