jackson - 解析 yaml 只有值,而不是键值对,
问题描述
我有一个如下所示的 yaml 文档 -
---
Village:
Persons:
-
name: Tom
age: 65
children:
- Bob
- Marla
-
name: Dick
age: 58
它可以很容易地解析。现在为简洁起见,我想像这样制作相同的文件 -
---
Village:
Persons:
-
Tom:
age: 65
children:
- Bob
- Marla
-
Dick:
age: 58
请注意,本质上它是相同的数据。如何将其解析为Person
上述文档之类的对象?我正在将 Java 与杰克逊解析器一起使用。
显然,我有所有 getter 和 setter 的Village和Person类。我认为带有默认构造函数和 String 参数的 Person 类可以解决问题,但事实并非如此。
解决方案
您将需要一个自定义设置器来反序列化您的Village
类中的 Persons。然后,您的Village
课程将如下所示:
public class Village {
List<Person> persons = new ArrayList<>();
@JsonProperty("Persons")
public void setPersons(Map<String, Person> personMap){
for (Map.Entry<String, Person> entry : personMap.entrySet()) {
entry.getValue().setName(entry.getKey());
persons.add(entry.getValue());
}
public List<Person> getPersons() {
return persons;
}
}
在setPersons
方法内部,来自您的 yaml 的 Persons 被用作键值对。
由于 yaml 中的键是 Person 的名称,因此您只需迭代映射并使用setName
将名称注入每个Person
对象。
之后,您将 Person 添加到您的Village
.
推荐阅读
- java - 尝试使用 SharedPreferences 存储和检索应用程序数据,但它没有返回所需的数据
- android - 仅在片段可见时如何调用函数
- javascript - encodeURIComponent 和内容类型:'charset: utf-8'
- javascript - 在 webpack 中找不到模块
- mysql - 这是用唯一值填充维度表的适当方法吗?
- javascript - 单击 puppeteer 中包含文本的元素
- docker - 为什么 Jenkins 缓存我旧的损坏的 Jenkinsfile?
- kubernetes - kubernetes - 更新到 1.16.8 后连接被拒绝
- javascript - 如何将带有动态字段(一组)的表单输入从子窗口(使用window.open打开)传递给父窗口
- flutter - 如何使所有按钮在颤动时一起挤压到左侧?