簡體   English   中英

如何解析 SnakeYAML 中的 snake_case 屬性

[英]How to parse snake_case properties in SnakeYAML

Jackson 提供了一種非常簡單的方法來解析 camel_case 屬性。 例如:

具有 snake_case 屬性的 jackson.yaml:

customers:
  - first_name: "John"
    last_name: "Doe"
    age: 52

解析代碼:

ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("jackson.yaml");
Orders orders = objectMapper.readValue(inputStream, Orders.class);

但是 SnakeYaml 中是否有類似的東西(例如PropertyNamingStrategies.SNAKE_CASE選項)?

PS 目前,我發現的唯一方法是分別在每個屬性上使用@YamlProperty注釋

據我所知,SnakeYAML 在內部使用反射,因此你需要在你的類中有屬性名稱等於你的 YAML 文件中的屬性名稱。

因此,在您的情況下,如果您有帶有蛇形外殼的 yaml 文件,則必須在帶有蛇形外殼的類中使用屬性名稱。

請參見下面的示例:

客戶.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
    private String first_name;
    private String last_name;
    private Integer age;
}

訂單.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
    private List<Customer> customers;
}

主.java

public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("jackson.yaml");

        Yaml yaml = new Yaml();
        Order order = yaml.loadAs(inputStream, Order.class);
        System.out.println(order);
    }
}

傑克遜.yaml

customers:
  - first_name: "John"
    last_name: "Doe"
    age: 52

輸出:

Order(customers=[Customer(first_name=John, last_name=Doe, age=52)])

編輯:

還有一個定義 TypeDescriptors 的選項,它告訴 SnakeYAML 如何映射字段。 請參見下面的示例:

public class Main {

    @SneakyThrows
    public static void main(String[] args) {
        InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("jackson.yaml");

        TypeDescription customerDescriptor = new TypeDescription(Customer.class);
        customerDescriptor.substituteProperty("first_name", String.class, "getFirstName", "setFirstName");
        customerDescriptor.substituteProperty("last_name", String.class, "getLastName", "setLastName");
        customerDescriptor.setExcludes("firstName", "lastName");

        Constructor constructor = new Constructor(Customer.class);
        Representer representer = new Representer(new DumperOptions());

        constructor.addTypeDescription(customerDescriptor);
        representer.addTypeDescription(customerDescriptor);

        Yaml yaml = new Yaml(constructor, representer);
        Order order = yaml.loadAs(inputStream, Order.class);
        System.out.println(order);
    }
}

傑克遜.yaml

customers:
  - first_name: "John"
    last_name: "Doe"
    age: 52

客戶.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Customer {
    private String firstName;
    private String lastName;
    private Integer age;
}

輸出:

訂單(客戶=[客戶(名字=約翰,姓氏=母鹿,年齡=52)])

暫無
暫無

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

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