杰克逊收集为了
问题描述:
我使用杰克逊有日志输出为JSON。
的事情之一是,我们允许使用以下语法登录:杰克逊收集为了<Object>属性顶层JSON输出字符串
log.info("yourMessage {}", innerMessageObject, Meta.of("key", ObjectValue))
输出I HAVE
{
"level": INFO,
... classic logging attributes
"metadata": {
"object1": "value 1",
"object2": { ... }
...
}
}
输出I WANT
{
"level": INFO,
... classic logging attributes
"object1": "value 1",
"object2": { ... }
...
}
我的日志POJO
@Data
class JsonLog {
@JsonIgnore
private static final ObjectMapper mapper = JsonLog.initMapper();
private final String message;
private final String class_name;
private final Collection<Object> metadata;
private final Marker marker;
private final String level;
private final Long timestamp;
private final String thread;
private final String logger;
private final LoggerContextVO logger_context;
private final Map<String, String> environment_vars;
}
我没有成功,只具有metadata
属性序列化为顶级属性。
看来我不能用@JsonUnwrapped
因为this issue,我也试过this solution但不能看到如何实现它。
你有什么想法?
谢谢:)
答
难道是OK转换metadata
是Map<String, Object>
?这似乎是你的例子JSON,这实际上是Java中JSON的自然泛型表示。在这种情况下:
private final Map<String, Object> metadata;
@JsonAnyGetter
Map<String, Object> getMetadata() {
return metadata;
}
按照docs,这个注释标记getter方法:
被序列化为含有POJO(类似于解缠)
并能的一部分只能用于返回Map
的方法。我不知道的解决方案Collection
感谢您的回答,它需要一些修改,但我会试一试! – ogdabou
谢谢你的作品:) – ogdabou