如果你想在java中为两个对象提供一个通用的访问api,那么引入一个接口,让两者都实现。
如果您只希望两个对象(PersonFromDB1 和 PersonFromDB2)通过 json 以相同的方式序列化,您可以:
- 使用注释 -
@SerializedName 注释与 @Expose 结合使用。
- 使用
FieldNamingStratgy 和ExclusionStrategy
使用注解控制序列化
public class PersonFromDB1 {
@Expose
@SerializedName("firstName")
private String firstName;
@Expose
@SerializedName("lastName")
private String lastName;
private String car;
}
public class PersonFromDB2 {
@Expose
@SerializedName("firstName")
private String first_Name;
@Expose
@SerializedName("lastName")
private String last_Name;
private String boat;
}
然后你可以使用GsonBuilder
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
PersonFromDB1 person1 = ...; // get the object
PersonFromDB2 person2 = ...; // get the object
System.out.println(gson.toJson(person1));
System.out.println(gson.toJson(person2));
使用FieldNamingStratgy和ExclusionStrategy控制序列化
如果您不想修改 db 对象(您不能或不想添加注释),那么还有另一种方法。您可以使用FieldNamingStratgy 和ExclusionStrategy。
class PersonFromDBNamingStrategy implements FieldNamingStrategy {
Map<String, String> fieldMapping = new HashMap<String, String>();
public PersonFromDBNamingStrategy() {
fieldMapping.put("first_Name", "firstName");
fieldMapping.put("last_Name", "lastName");
}
@Override
public String translateName(Field f) {
String name = f.getName();
if(fieldMapping.contains(name)){
return fieldMapping.get(name);
}
return name;
}
}
还有ExclusionStrategy
class PersonFromDExclusionStrategy implements ExclusionStrategy {
List<String> validNames = Arrays.asList("car", "boat");
@Override
public boolean shouldSkipField(FieldAttributes f) {
String name = f.getName();
return !validNames.contains(name);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
然后像这样创建 Gson:
GsonBuilder gsonBuilder = new GsonBuilder();
sonBuilder.addSerializationExclusionStrategy(new PersonFromDExclusionStrategy());
gsonBuilder.setFieldNamingStrategy(new PersonFromDBNamingStrategy());
Gson gson = gsonBuilder.create();
PersonFromDB1 person1 = ...; // get the object
PersonFromDB2 person2 = ...; // get the object
System.out.println(gson.toJson(person1));
System.out.println(gson.toJson(person2));