jackson 如何解析SnakeYAML中的snake_case属性

wb1gzix0  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(187)

Jackson提供了一种非常简单的方法来解析camel_case属性。
带有snake_case属性的Jackson:

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注解

i7uaboj4

i7uaboj41#

据我所知,SnakeYAML在内部使用反射,因此,您需要使类中的属性名等于YAML文件中的属性名。
因此,在您的情况下,如果您有带snake case的yaml文件,则必须在带snake case的类中使用属性名称。
参见以下示例:
Customer.java

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

Order.java

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

Main.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);
    }
}

jackson.yaml

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

输出:

Order(customers=[Customer(first_name=John, last_name=Doe, age=52)])
    • 编辑:**

还有一个选项用于定义TypeDescriptors,告诉SnakeYAML如何Map字段。请参见下面的示例:

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);
    }
}

jackson.yaml

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

Customer.java

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

输出:
订单(客户=[客户(名字= John,姓氏= Doe,年龄= 52)])

相关问题