Java中使用Gson库如何读取JSON的@odata.context变量
Gson处理特殊命名JSON字段方案
问题场景
处理JSON结构时遇到包含@、.等特殊字符的键名,示例JSON片段:
{ "@odata.context":"https://te.avolutionsoftware.com/api/$metadata#Components/$entity" }
直接按照键名定义Java字段private String @odata.context;不符合Java标识符语法规范,无法通过编译。
具体解决步骤
使用Gson提供的@SerializedName注解做字段名映射即可,步骤如下:
- 在实体类中定义符合Java命名规范的自定义字段名
- 在字段上添加
@SerializedName注解,注解的参数值填入JSON中实际的特殊键名
示例代码:
import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; // 自定义实体类 public class ComponentEntity { // 注解内写JSON真实键名,字段名自行按Java规范定义 @SerializedName("@odata.context") private String odataContext; // 自行补充getter、setter方法,或使用Lombok等工具简化 public String getOdataContext() { return odataContext; } public void setOdataContext(String odataContext) { this.odataContext = odataContext; } public static void main(String[] args) { String jsonStr = "{\"@odata.context\":\"https://te.avolutionsoftware.com/api/$metadata#Components/$entity\"}"; // 正常调用Gson方法反序列化即可,无需额外配置 ComponentEntity entity = new Gson().fromJson(jsonStr, ComponentEntity.class); System.out.println(entity.getOdataContext()); } }
运行后可以正常读取到特殊键名对应的字段值,序列化时Gson也会自动把字段输出为@odata.context的键名。
同类问题通用检索方向
- 单字段特殊命名/字段名不匹配场景:检索当前使用的JSON库(Gson/Jackson/Fastjson等)的自定义字段名映射注解,所有主流JSON库都提供了对应注解实现键名和Java字段的绑定
- 全局统一命名规则转换场景(比如驼峰转下划线、全大写转驼峰等):检索对应JSON库的全局命名策略配置,配置后无需给单个字段加注解,自动完成全量字段的命名转换
- 动态键名、含转义字符的极端特殊键名场景:检索对应JSON库的自定义反序列化器、Json树模型解析相关API,直接操作底层JSON节点完成取值。
内容的提问来源于stack exchange,提问作者fatherazrael
相关产品推荐
相关产品推荐

