2017-10-28 134 views
1

我使用杰克逊有日志输出为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但不能看到如何实现它。

你有什么想法?

谢谢:)

回答

1

难道是OK转换metadataMap<String, Object>?这似乎是你的例子JSON,这实际上是Java中JSON的自然泛型表示。在这种情况下:

private final Map<String, Object> metadata; 

@JsonAnyGetter 
Map<String, Object> getMetadata() { 
    return metadata; 
} 

按照docs,这个注释标记getter方法:

被序列化为含有POJO(类似于解缠)

并能的一部分只能用于返回Map的方法。我不知道的解决方案Collection

+0

感谢您的回答,它需要一些修改,但我会试一试! – ogdabou

+0

谢谢你的作品:) – ogdabou