[英]How to convert firebase data (snake_case) to Java object (camelCase)
[英]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.