Jackson Collection <object>属性到顶级JSON输出字符串

时间:2017-10-28 12:55:06

标签: java json jackson

我正在使用Jackson,以便将日志输出作为JSON 事情是我们允许使用以下语法进行日志记录:

log.info("yourMessage {}", innerMessageObject, Meta.of("key", ObjectValue))

我有输出

{
  "level": INFO,
  ... classic logging attributes
  "metadata": {
     "object1": "value 1",
     "object2": { ... }
     ...
   }
}

输出我想要

{
  "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属性序列化为顶级属性。

由于this issue,我似乎无法使用@JsonUnwrapped,我也尝试this solution,但看不到如何实现它。

你有什么想法吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

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

的解决方案