You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:55:14