如何使用Java Reflection实现JSON与Java类异名字段的自定义映射
自定义反射实现映射器的可行方案
- 第一步:自定义映射注解解耦配置,定义
@JsonFieldBind注解,内部加String sourceKey()属性,用来标注Java字段对应的JSON字段名。你当前场景的字段可以直接标注:- Parent类的
Name1上标注@JsonFieldBind(sourceKey = "FirstName") - Parent类的
Name2上标注@JsonFieldBind(sourceKey = "LastName")(注意你原Java代码此处笔误写为Nama2,需修正) - Address类的
data上标注@JsonFieldBind(sourceKey = "street") - Parent类的
address上标注@JsonFieldBind(sourceKey = "Address")
- Parent类的
- 第二步:先将JSON字符串解析为嵌套的
JSONObject/Map结构,不需要提前绑定目标类,仅需要拿到键值对映射关系。 - 第三步:编写通用反射赋值逻辑:
- 获取目标类的无参构造器,实例化空白的目标对象。
- 调用
getDeclaredFields()获取目标类所有声明字段,设置field.setAccessible(true)绕过私有字段访问校验。 - 遍历每个字段,优先取字段上
@JsonFieldBind注解的sourceKey作为取值键,没有注解则直接用字段名作为取值键。 - 从JSON结构中取出对应键的值,若值为基础类型(字符串、数值、布尔)直接调用
field.set(目标实例, 取值)完成赋值。 - 若值为数组/列表类型,先通过
Field.getGenericType()拿到List的泛型参数类(比如你场景里的Address类),遍历JSON数组的每个元素,递归调用当前赋值逻辑生成泛型类实例,组装为List后赋值给对应字段。 - 若值为嵌套对象类型,直接递归调用赋值逻辑生成嵌套对象后赋值即可。
- 第四步:可扩展增加类型转换、默认值填充、异常兼容等能力,完善映射器的通用性。
更推荐的第三方API方案(无需重复造轮子)
目前Java生态已有成熟的JSON转Java对象库,原生支持自定义字段映射,不需要自己手写反射逻辑:
- Jackson:Java生态最通用的JSON处理库,用
@JsonProperty注解标注对应JSON字段即可,示例代码:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; // 注意原代码Class首字母大写属于语法错误,修正为小写class class Parent{ @JsonProperty("FirstName") private String Name1; @JsonProperty("LastName") private String Name2; @JsonProperty("Address") private List<Address> address; // 此处可添加getter、setter,或者用Lombok简化代码 } class Address{ private String type; @JsonProperty("street") private String data; // 此处可添加getter、setter,或者用Lombok简化代码 }
反序列化仅需一行代码即可完成:
Parent result = new ObjectMapper().readValue(合法JSON字符串, Parent.class);
- Gson:Google出品的JSON处理库,用法和Jackson类似,用
@SerializedName注解标注映射的JSON字段即可。
注意:你给出的示例JSON存在语法错误,键名未加双引号、对象末尾多了冗余逗号,实际使用时需先修正为合法JSON格式。
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

