如何创建含保留关键字class的JSON映射类以支持POST请求
解决JSON保留关键字"class"的映射问题
当JSON字段名和编程语言的保留关键字冲突时,核心解决思路是通过序列化/反序列化框架的注解,将合法的类属性名与JSON的关键字字段做映射,以下是几种主流编程语言的具体实现:
Java(Jackson/Gson框架)
Jackson实现
在类属性上添加@JsonProperty注解,指定对应的JSON字段名:
// 定义内部模型类 class Department { private String id; private String refName; // getter、setter省略 } class ClassInfo { private String id; private String refName; // getter、setter省略 } class ItemDetail { private Department department; // 用@JsonProperty关联JSON的"class"字段 @JsonProperty("class") private ClassInfo classInfo; // getter、setter省略 } class Item { private List<ItemDetail> items; // getter、setter省略 }
序列化/反序列化时,Jackson会自动识别注解,完成classInfo和JSON中class字段的映射。
Gson实现
Gson用@SerializedName注解,写法类似:
class ItemDetail { private Department department; @SerializedName("class") private ClassInfo classInfo; // getter、setter省略 }
Python(Pydantic/原生json模块)
Pydantic实现
用Field(alias="class")指定别名,序列化时需开启by_alias=True:
from pydantic import BaseModel, Field class Department(BaseModel): id: str refName: str class ClassInfo(BaseModel): id: str refName: str class ItemDetail(BaseModel): department: Department # 用alias关联JSON的"class"字段 class_info: ClassInfo = Field(alias="class") class Item(BaseModel): items: list[ItemDetail] # 序列化时要加by_alias=True,才能输出"class"字段 payload = Item(items=[ItemDetail(department=Department(id="5", refName="test"), class_info=ClassInfo(id="2", refName="test"))]) print(payload.model_dump_json(by_alias=True))
原生json模块实现
如果不用框架,可手动处理字段映射:
# 定义普通类 class ItemDetail: def __init__(self, department, class_info): self.department = department self.class_info = class_info # 转JSON时手动替换字段名 def item_detail_to_dict(item_detail): result = { "department": item_detail.department.__dict__, "class": item_detail.class_info.__dict__ } return result # 反序列化时同理,把"class"字段赋值给class_info属性
C#(Newtonsoft.Json框架)
用JsonProperty特性指定映射:
public class Department { public string id { get; set; } public string refName { get; set; } } public class ClassInfo { public string id { get; set; } public string refName { get; set; } } public class ItemDetail { public Department department { get; set; } [JsonProperty("class")] public ClassInfo ClassInfo { get; set; } } public class Item { public List<ItemDetail> items { get; set; } }
通用兜底方案
如果不想依赖框架注解,也可以在发送POST请求前,手动修改JSON结构:将内存中的对象转成字典/JSON字符串后,把合法属性名(比如classInfo)替换成class;接收响应时再反向替换。但这种方式代码冗余,不如框架注解优雅。
内容的提问来源于stack exchange,提问作者SSD
相关产品推荐
相关产品推荐

