簡體   English   中英

如何在 Java 的 Jackson 庫中打印對象名稱作為 JSON 的一部分?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM