如何使用Gson对SQS接收的JSON中特定子JSON应用UPPER_CAMEL_CASE规则?
用Gson处理DynamoDB事件JSON,给特定子节点应用大驼峰命名规则
我来帮你搞定这个需求!针对你从SQS收到的DynamoDB事件JSON,用Gson实现特定子节点的大驼峰(UPPER_CAMEL_CASE)命名转换,我分两种最常见的场景给你详细方案:
场景1:把JSON解析成Java对象,特定子节点按大驼峰映射字段
如果你的目标是把JSON转成Java对象,同时让某个子结构(比如dynamodb节点或者它里面的Keys)的字段遵循大驼峰命名逻辑,咱们可以这样做:
第一步:定义Java类结构
先把JSON对应的Java类写好,对于需要特殊命名映射的字段,用@SerializedName注解直接关联JSON键和Java大驼峰字段,简单直接:
import com.google.gson.annotations.SerializedName; // 顶层的DynamoDB事件类 public class DynamoDbEvent { // 这些顶层字段直接用默认命名映射就行 private String eventID; private String eventName; private String eventVersion; private String eventSource; private String awsRegion; // 指向子结构DynamoDbDetail private DynamoDbDetail dynamodb; private String eventSourceARN; private String itemType; // 别忘了加getter和setter,或者用lombok简化 // ... // 对应JSON里的dynamodb子节点,内部字段按大驼峰处理 public static class DynamoDbDetail { // JSON里的ApproximateCreationDateTime对应Java的大驼峰字段 private Long approximateCreationDateTime; private Keys keys; private String sequenceNumber; private Integer sizeBytes; private String streamViewType; // Getter和Setter // ... // 处理Keys里的下划线键转大驼峰 public static class Keys { // JSON的key_1映射到Java的Key1 @SerializedName("key_1") private String key1; // JSON的key_2映射到Java的Key2 @SerializedName("key_2") private String key2; // Getter和Setter // ... } } }
第二步:配置Gson并解析JSON
如果子节点的JSON键本身就是大驼峰(比如ApproximateCreationDateTime),而你希望Java字段用小驼峰,或者反过来,也可以自定义命名策略批量处理,不用一个个加注解:
import com.google.gson.FieldNamingPolicy; import com.google.gson.FieldNamingStrategy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.lang.reflect.Field; // 自定义命名策略:灵活处理大/小驼峰的转换 public class CamelCaseNamingStrategy implements FieldNamingStrategy { @Override public String translateName(Field field) { // 只对DynamoDbDetail及其内部类应用规则 if (DynamoDbDetail.class.isAssignableFrom(field.getDeclaringClass()) || DynamoDbDetail.Keys.class.isAssignableFrom(field.getDeclaringClass())) { // 这里是把Java小驼峰转成JSON大驼峰,比如approximateCreationDateTime → ApproximateCreationDateTime return Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1); // 如果是解析JSON大驼峰到Java小驼峰,就改成: // return Character.toLowerCase(field.getName().charAt(0)) + field.getName().substring(1); } // 其他字段用默认的命名规则 return FieldNamingPolicy.IDENTITY.translateName(field); } }
然后创建Gson实例并解析:
// 初始化Gson,绑定自定义命名策略 Gson gson = new GsonBuilder() .setFieldNamingStrategy(new CamelCaseNamingStrategy()) .create(); // 你的原始JSON字符串 String json = "{ \"eventID\": \"zzz\", \"eventName\": \"MODIFY\", \"eventVersion\": \"1.1\", \"eventSource\": \"aws:dynamodb\", \"awsRegion\": \"us-east-1\", \"dynamodb\": { \"ApproximateCreationDateTime\": 1521976320, \"Keys\": { \"key_1\": { \"S\": \"yyy\" }, \"key_2\": { \"S\": \"xxx\" } }, \"SequenceNumber\": \"123\", \"SizeBytes\": 321, \"StreamViewType\": \"KEYS_ONLY\" }, \"eventSourceARN\": \"arn:aws:dynamodb:us-east-1:eventSourceARN\", \"itemType\": \"myItem\" }"; // 解析成Java对象 DynamoDbEvent event = gson.fromJson(json, DynamoDbEvent.class); // 测试一下,能拿到正确的值就说明成了 System.out.println(event.getDynamodb().getApproximateCreationDateTime()); // 输出1521976320 System.out.println(event.getDynamodb().getKeys().getKey1()); // 输出yyy
场景2:把Java对象转成JSON时,特定子节点用大驼峰键
如果你是要把Java对象序列化成JSON,并且让某个子节点的键用大驼峰格式,上面的自定义命名策略同样适用,只需要调整策略里的转换逻辑就行。比如把Java小驼峰字段转成JSON大驼峰键,生成的JSON里dynamodb节点下的键就会是ApproximateCreationDateTime、Keys这种大驼峰格式,其他节点保持原有命名。
小提示
- 如果只是少数几个字段需要转换,直接用
@SerializedName注解最省事,不用写复杂的命名策略。 - 对于DynamoDB里的
{ "S": "yyy" }这种属性结构,你可以再定义一个AttributeValue类来映射,方便后续处理字符串、数字等不同类型的属性值。
内容的提问来源于stack exchange,提问作者belostoky
相关产品推荐
相关产品推荐

