问题描述
我正在尝试确定如何使用 Java 的 Jackson 库打印出如下所示的 JSON:
{
"status": {
{
"busstatus" : {
"status" : null,"transactions" : "0","retries" : "0","failures" : "0"
}
}
}
}
我已经完成了 95%,但是当前没有打印最外面的对象。这是我目前得到的输出:
{
"busstatus" : {
"status" : null,"failures" : "0"
}
}
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);