【发布时间】:2017-07-27 10:57:31
【问题描述】:
我正在尝试使用 google gson TypeAdapter 将嵌套 JSON 转换为嵌套 Java 对象,每个类都实现了 TypeAdapter。但我不想在单个适配器类中编写完整的 read() 方法逻辑。我在网上提到了几个问题和blog 示例。但是完整的读取逻辑在单个类中。
对于小的嵌套对象,在单个适配器中有逻辑很好,但对于大对象(每个类中有超过 10-15 个字段)就不好了。
[更新]
例如,json 键看起来与类属性相同,但实际上我将输入 hyphen-separated-small-case 键而不是 Camel case 键。所以我的 json 和 java 类属性名称不会相同,因此我必须编写我的自定义映射逻辑。
例如 示例 Json 输入:
{
"id": 1,
"name": "Alex",
"emailId": "alex@gmail.com",
"address": {
"address": "21ST & FAIRVIEW AVE",
"district": "district",
"city": "EATON",
"region": "PA",
"postalCode": "18044",
"country": "US"
}
}
Java bean 如下:
//Employee object class
public class Employee {
private int id;
private String name;
private String emailId;
private Address address;
..
}
//Address object class
public class Address {
private String address;
private String district;
private String city;
private String region;
private String postalCode;
private String country;
..
}
我想要两个不同的适配器,并在 read() 方法中集成多个适配器。
public class EmployeeAdapter extends TypeAdapter<Employee> {
@Override
public void write(JsonWriter out, Employee employee) throws IOException {
//
}
@Override
public Employee read(JsonReader jsonReader) throws IOException {
//read logic for employee class using AddressAdapter for address json
}
}
public class AddressAdapter extends TypeAdapter<Address> {
@Override
public void write(JsonWriter out, Address address) throws IOException {
//
}
@Override
public Address read(JsonReader jsonReader) throws IOException {
//read logic for Address class
}
}
如何在 EmployeeAdapter 中使用 AddressAdapter?
【问题讨论】:
-
您是否尝试过使用阅读器的默认实现?还是您有特定的理由编写自己的适配器?
-
这和杰克逊有什么关系??请删除标签
-
看起来你只需要 POJO 映射,而类型适配器在这里真的是大材小用:
final Employee employee = gson.fromJson(..., Employee.class)似乎已经完成了。 -
@LyubomyrShaydariv:更新问题。谢谢你说清楚。
-
@StefanLindner :是的,例如,我仅将示例 json 复制为类属性,但实际上我必须考虑 连字符分隔的小写 属性名称。这就是为什么我需要编写自定义的。
标签: java json gson json-deserialization