我将如何在 Java 的 Jackson 库中将对象的名称作为 JSON 的一部分打印出来?

问题描述

我正在尝试确定如何使用 Java 的 Jackson 库打印出如下所示的 JSON:

{
    "status": {
        {
          "busstatus" : {
            "status" : null,"transactions" : "0","retries" : "0","failures" : "0"
          }
        }
    }
}

我已经完成了 95%,但是当前没有打印最外面的对象。这是我目前得到的输出

{
  "busstatus" : {
    "status" : null,"failures" : "0"
  }
}

我有一个看起来像这样的 Java 类:

public class DataClass {

    public StatusData status = new StatusData();
    public StatusConfig config = new StatusConfig();
    

    public class StatusData {
        public SerialStatus busstatus = new SerialStatus();
    }
    
    public class StatusConfig {
        
    }

    public class SerialStatus {
        public String status = null;
        public String transactions = "0";
        public String retries = "0";
        public String failures = "0";
    }
}

我正在使用以下代码将此类打印到 json:

private DataClass internalData;
ObjectMapper mapper = new ObjectMapper();
status = mapper.writerWithDefaultPrettyPrinter().writeValueAsstring(internalData.status);

有没有办法可以配置 Jackson 打印出它序列化到 JSON 中的对象的名称

解决方法

要实现您想要的效果,您需要打印 DataClass 而不是 StatusData。类似于以下内容:

private DataClass internalData = <initialize>;
ObjectMapper mapper = new ObjectMapper();
String data = 
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(internalData);
,

您可以使用 Jackson Filter 来控制序列化过程,我认为它应该适用于您的用例,至少是一种方法。

使用过滤器注解,然后为您的类创建两个不同的过滤器,您可以在其中定义要跳过的字段,并相应地与 ObjectMapper 一起使用以转换整个 internalData 对象,因此当您需要跳过时状态,使用一个过滤器,当您需要跳过配置时,将另一个过滤器与映射器相关联,同时始终序列化父对象。这应该给你你想要的结构。

        @JsonFilter("filter_serializer")
        class User {
            public String v1;
            public String v2;
        }

        String[] fieldsToSkip = new String[] { "v1" };

        ObjectMapper mapper = new ObjectMapper();

        final SimpleFilterProvider filter = new SimpleFilterProvider();
        filter.addFilter("filter_serializer",SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));


        User dtoObject = new User();
        dtoObject.v1 = "v1";
        dtoObject.v2 = "v2";
        String jsonStr =  mapper.writer(filter).writeValueAsString(dtoObject);
    
,

我找到了我正在寻找的解决方案,from this website

我已经摆脱了 DataClass,现在只有一个 StatusData 和一个 StatusConfig 类。我在下面介绍了 StatusData 类的外观:

@JsonRootName(value = "status")
public class StatusData {
    String status;
    String transactions;
    // so on
}

为了解析类,我需要在上面添加 JsonRootName 注释,并在映射器上启用一个功能,如下所示:

private DataClass internalData;
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); // don't forget this!
statusText = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(statusObject);

另外,如果您想将 JSON 反序列化为像 StatusData 这样的类,请执行以下操作:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE,true);
statusObject = mapper.readValue(statusText,StatusData.class);