![](/img/trans.png)
[英]How can i deserialize Json string where object's field's subclass is included in json string, using Java and Jackson library
[英]How would I print an object's name as part of the JSON in Java's Jackson library?
我正在嘗試確定如何使用 Java 的 Jackson 庫打印出看起來像這樣的 JSON:
{
"status": {
{
"busStatus" : {
"status" : null,
"transactions" : "0",
"retries" : "0",
"failures" : "0"
}
}
}
}
我在那里 95%,但最外面的 object 目前沒有打印。 這是我目前正在輸出的內容:
{
"busStatus" : {
"status" : null,
"transactions" : "0",
"retries" : "0",
"failures" : "0"
}
}
我有一個 Java class 看起來像這樣:
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";
}
}
我正在使用以下代碼將此 class 打印到 json :
private DataClass internalData;
ObjectMapper mapper = new ObjectMapper();
status = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(internalData.status);
有沒有辦法可以配置 Jackson 以打印出 object 的名稱,並將其序列化為 JSON?
要實現您想要的,您需要打印DataClass
而不是StatusData
。 如下所示:
private DataClass internalData = <initialize>;
ObjectMapper mapper = new ObjectMapper();
String data =
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(internalData);
您可以使用 Jackson 過濾器來控制序列化過程,我認為它應該適用於您的用例,至少有一種方法可以做到。
使用過濾器注釋,然后為您的 class 創建兩個不同的過濾器,您可以在其中定義要跳過的字段,並相應地與 ObjectMapper 一起使用它來轉換整個internalData
object,因此當您需要跳過狀態時,使用一個過濾器和當您需要跳過配置時,將另一個過濾器與映射器關聯,同時始終序列化父 object。 哪個應該給你你想要的結構。
@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);
我能夠從這個網站找到我正在尋找的解決方案。
我已經擺脫了 DataClass,現在只有一個 StatusData 和一個 StatusConfig class。 我已經包含了 StatusData class 的外觀如下:
@JsonRootName(value = "status")
public class StatusData {
String status;
String transactions;
// so on
}
要解析 class,我需要在上面添加 JsonRootName 注釋,並在映射器上啟用一個功能,如下所示:
private DataClass internalData;
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); // don't forget this!
statusText = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(statusObject);
另外,如果您想將 JSON 反序列化為 class (如 StatusData),請執行以下操作:
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
statusObject = mapper.readValue(statusText, StatusData.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.