我想使用 Google Gson TypeAdapter 将嵌套的 JSON 转换为嵌套的 Java 对象,并为每个类实现 TypeAdapter。但我不想在单个适配器类中编写完整的 read() 方法逻辑。我查阅了网上的一些问题和博客示例。但是完整的读取逻辑都在一个类中。
对于小的嵌套对象,单个适配器中的逻辑还可以,但对于大型对象(每个类中有10-15个以上字段)来说就不好了。 [更新] 例如,JSON 键看起来与类属性相同,但实际上我将获得输入作为
例如: 示例 Json 输入:
我希望有两个不同的适配器,并在read()方法中集成多个适配器。
如何在EmployeeAdapter中使用AddressAdapter?
对于小的嵌套对象,单个适配器中的逻辑还可以,但对于大型对象(每个类中有10-15个以上字段)来说就不好了。 [更新] 例如,JSON 键看起来与类属性相同,但实际上我将获得输入作为
连字符分隔的小写
键而不是驼峰命名法
键。因此,我的 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?
final Employee employee = gson.fromJson(..., Employee.class)
看起来已经足够了。 - Lyubomyr Shaydariv@SerializedName
可能会对您有所帮助 https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html - Lyubomyr ShaydarivReflectiveTypeAdapterFactory.Adapter
由于反射而慢,但如果您要从外部资源中获取JSON,则比较取回资源所花费的时间更长。如果您真的认为ReflectiveTypeAdapterFactory.Adapter
对您来说很慢,那么您要么必须创建一堆自定义类型适配器,要么只能使用JsonReader
并手动逐个令牌解析构建结果对象。后者似乎具有最佳性能,因为您甚至不需要Gson
和TypeAdapter
以及它们在幕后完成的工作。 - Lyubomyr Shaydariv