簡體   English   中英

將嵌套的 map 字段轉換為蛇案例

[英]Convert nested map fields to snake case

如何將呈現為 json 的以下 object 的所有嵌套字段轉換為 snake_case? 鑒於它被讀取為org.bson.Document , jackson object 映射器將無法工作,因為它是為 POJO 設計的,並且這里不可能有 POJO,因為記錄是無模式的

{
   "project_data":[
      {
         "color":"#ffcd03",
         "boardId":"30022"
      },
      {
         "color":"#ffcd03",
         "boardId":"1559427"
      }
   ],
   "type":"Standard",
   "enterprise_id":"30000",
   "version":"10",
   "card_type_id":"30017",
   "owner_type":"Org",
   "timestamp":"1640901794509"
}

可以通過向SimpleModule添加自定義鍵序列化程序來輕松完成,然后將其注冊到ObjectMapper ,如下所示:

創建一個 class SnakeCaseSerializer ,它擴展了JsonSerializer以覆蓋serialize()以使用 Google Guava 庫 - CaseFormat將鍵從小駝峰大小寫修改為小寫下划線大小寫(又名蛇大小寫)。

public class SnakeCaseSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        String fieldNameNew = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, s);
        jsonGenerator.writeFieldName(fieldNameNew);
    }
}

將此 class 添加到SimpleModule作為自定義密鑰序列化程序,然后將模塊注冊到您的ObjectMapper (這種方式將更改所有字段名稱,但這並不重要,因為屬於第一級的字段名稱已經在蛇形大小寫。)

SimpleModule simpleModule = new SimpleModule();
simpleModule.addKeySerializer(String.class, new SnakeCaseSerializer());

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(simpleModule);

System.out.println(objectMapper.writerWithDefaultPrettyPrinter()
        .writeValueAsString(objectMapper.readValue(jsonStr, Object.class)));

控制台 output:

{
  "project_data" : [ {
    "color" : "#ffcd03",
    "board_id" : "30022"
  }, {
    "color" : "#ffcd03",
    "board_id" : "1559427"
  } ],
  "type" : "Standard",
  "enterprise_id" : "30000",
  "version" : "10",
  "card_type_id" : "30017",
  "owner_type" : "Org",
  "timestamp" : "1640901794509"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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