Java 使用基于键的类型名反序列化多形态JSON类型
下面是我想用Jackson反序列化的JSON示例Java 使用基于键的类型名反序列化多形态JSON类型,java,json,jackson,Java,Json,Jackson,下面是我想用Jackson反序列化的JSON示例 { "person": { "contacts": { "address": { "type": "Office", "street": "1600 Amphitheatre Parkway", "city": "Mountain View", "state": "CA", "zip": "94043", "country":
{
"person": {
"contacts": {
"address": {
"type": "Office",
"street": "1600 Amphitheatre Parkway",
"city": "Mountain View",
"state": "CA",
"zip": "94043",
"country": "United States"
},
"email": {
"type": "Home",
"emailAddress": "e.schmidt@google.com"
},
"phone": [
{
"type": "Mobile",
"phoneNumber": "+1 888 555555"
},
{
"type": "Home",
"phoneNumber": "+1 888 1111111"
}
],
"website": {
"type": "work",
"webService": "URL",
"webAddress": "www.google.com"
}
},
"firstName": "Eric",
"lastName": "Schmidt"
}
}
这里需要反序列化的棘手部分是contacts节点。
注意事项:
电子邮件
,地址
,网站
)或一个数组(如果有多个(电话
),则此包装可以是对象public class Person
{
public String firstName;
public String LastName;
public List<Contact> contacts; // mixes Address, Phone, Email, Website
}
public abstract class Contact {
public Long id;
}
public class Phone extends Contact
{
public String type;
public String phoneNumber;
}
// other subtypes of Contact omitted for brevity
公共类人物
{
公共字符串名;
公共字符串LastName;
公开列出联系人;//混合地址、电话、电子邮件和网站
}
公共抽象类联系人{
公共长id;
}
公共类电话延长了联系时间
{
公共字符串类型;
公共字符串电话号码;
}
//为简洁起见,省略了接触的其他子类型
注意:外部需求要求我使用抽象的联系人
类型。我宁愿直接反序列化到这些POJO,而不是让联系人类型挂起的中间联系人
POJO在另一个步骤中手动映射/转换到我的列表
我已经研究了许多其他jackson+多态反序列化问题,但似乎没有一个能够处理这个问题(特别是第2和第3个问题)
我想将联系人对象反序列化为列表
要实现这一点,正确应用@JsonTypeInfo
和@JsonSubTypes
需要什么
(如果有人对此感兴趣)您需要编写一个自定义反序列化程序并向Jackson注册。实现将检查初始启动,然后进行相应的解析。考虑sax风格的处理。检查此链接以从json生成java类,并进行必要的更改感谢提示,但是该站点生成了一个
联系人
POJO,这是我试图通过利用Jackson的多态特性来避免的中间映射/转换。将联系人亲自更改为Object,而不是class,这样你就可以稍后键入cast,并接受此作为答案,因为这似乎是满足我最初要求的唯一可能的解决方案。最后,我将JSON解析为中间POJO,然后手动将其转换为我想要的类型树。