Interface FieldNamingStrategy cho phép tùy biến tên field khi serialize (Java field name → JSON key). Implement translateName(Field).
Ví dụ: Prefix "pre_" cho mọi field
import com.google.gson.*;
import java.lang.reflect.Field;
public class GsonFieldNamingStrategyTest {
public static void main(String[] args) {
Employee emp = new Employee();
emp.setEmpId(115);
emp.setFirstName("Adithya");
emp.setLastName("Jai");
Gson gson = new GsonBuilder()
.setFieldNamingStrategy(new CustomFieldNamingStrategy())
.create();
String result = gson.toJson(emp);
System.out.println(result);
}
static class CustomFieldNamingStrategy implements FieldNamingStrategy {
@Override
public String translateName(Field field) {
return "pre_" + field.getName(); // Thêm prefix
}
}
}
class Employee {
private int empId;
private String firstName, lastName;
// getters/setters...
}
Output
{"pre_empId":115,"pre_firstName":"Adithya","pre_lastName":"Jai"}
Built-in FieldNamingPolicy (Enum)
Gson cung cấp sẵn các policy phổ biến (xem bài 1003094153):
IDENTITY- giữ nguyên (mặc định)LOWER_CASE_WITH_DASHES-firstName→first-nameLOWER_CASE_WITH_UNDERSCORES-firstName→first_name(snake_case)UPPER_CAMEL_CASE-firstName→FirstNameUPPER_CAMEL_CASE_WITH_SPACES-firstName→First Name
Sử dụng Built-in Policy
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();
Khi nào cần Custom Strategy?
- Naming convention đặc biệt không có trong built-in (VD: prefix/suffix, custom delimiter).
- Mapping với external API có naming rule lạ.
- Dynamic naming dựa trên field annotation, type, v.v.
Jackson Equivalent
// Jackson: PropertyNamingStrategy
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); // built-in
// Hoặc custom:
mapper.setPropertyNamingStrategy(new PropertyNamingStrategy() {
@Override
public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) {
return "pre_" + defaultName;
}
});