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

使用@JsonProperty映射下划线字段为驼峰后,请求哈希验证失败该如何解决?

问题根源

你遇到的哈希不一致问题,核心原因是混用了Jackson和Gson两个JSON处理库:

  • 你用Jackson的@JsonProperty注解将下划线字段映射为驼峰Java字段,但Gson并不识别Jackson的注解;
  • 用gson.toJson(req)序列化时,Gson会直接使用Java字段名(currencyReceived)生成JSON,而原始请求的字段是currency_received,两者JSON结构完全不同,最终哈希值自然无法匹配。
解决方案

方案1:统一使用Jackson完成序列化(推荐)

既然你已经用Jackson做反序列化,直接用Jackson的ObjectMapper来序列化请求对象,它会自动遵循@JsonProperty的配置,生成和原始请求结构一致的JSON:

// 初始化ObjectMapper(建议全局单例)
ObjectMapper objectMapper = new ObjectMapper();
// 关闭缩进,保证和原始请求的JSON格式一致(避免空格/换行影响哈希)
objectMapper.configure(SerializationFeature.INDENT_OUTPUT, false);

String reqObj = objectMapper.writeValueAsString(req);
String hashVal = HashGeneratorUtils.generateHmacSHA512(reqObj, pvt_key);

这个方案最简洁,避免跨库注解不兼容的问题,也能保证序列化逻辑和原始请求的生成逻辑一致。

方案2:让Gson识别Jackson的@JsonProperty注解

如果必须使用Gson,可以通过注册适配器让Gson支持Jackson的注解,需要添加对应依赖并配置Gson:

// 依赖需包含 com.google.gson:gson 和 com.fasterxml.jackson.core:jackson-annotations
Gson gson = new GsonBuilder()
    .registerTypeAdapterFactory(new JacksonAnnotationAdapter())
    .create();

String reqObj = gson.toJson(req);
String hashVal = HashGeneratorUtils.generateHmacSHA512(reqObj, pvt_key);

方案3:添加Gson的@SerializedName注解兼容

在Java字段上同时添加Gson的@SerializedName注解,和@JsonProperty保持一致,这样Gson序列化时会使用下划线字段名:

@JsonProperty("currency_received")
@SerializedName("currency_received")
private CurrencyReceived currencyReceived;

之后用Gson序列化就能生成和原始请求一致的JSON字段名。

额外注意事项
  • 序列化时要保证和原始请求的JSON格式完全一致:比如是否忽略空值、字段顺序、是否有缩进/空格,这些细节都会影响哈希结果;
  • 如果原始请求的JSON有固定字段顺序,需要配置JSON库保持相同顺序(比如Jackson可以开启MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,或者自定义排序)。

内容的提问来源于stack exchange,提问作者arqam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:25:39