Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Triển khai custom FieldNamingStrategy dùng Gson (Java)

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-name
  • LOWER_CASE_WITH_UNDERSCORES - firstName → first_name (snake_case)
  • UPPER_CAMEL_CASE - firstName → FirstName
  • UPPER_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;
    }
});