【注解】@JsonProperty 详解

@JsonProperty

@JsonProperty 是 Jackson 库中的一个注解,用于自定义 Java 对象字段与 JSON 属性之间的映射关系。它可以用于序列化和反序列化阶段,对象字段的 JSON 键名可以通过此注解进行配置。

一、@JsonProperty 的主要功能

  • 自定义 JSON 键名:通过 @JsonProperty,你可以指定字段在序列化为 JSON 时应该使用的键名,或在反序列化时从 JSON 中获取值的键名。
  • 控制字段的可见性:即使字段不可见(如 private),只要使用了 @JsonProperty,Jackson 仍然可以访问它。
  • 用于字段和方法:@JsonProperty 可以应用于字段、getter 方法、setter 方法,甚至是构造函数的参数。

二、使用 @JsonProperty 的典型场景

真实开发应用场景参考–> 数据库存的JSON数据转为Map,key值是中文,转成英文,转为json数据传给前端

1). 自定义字段名称

如果 Java 类中的字段名与 JSON 属性名不同,你可以通过 @JsonProperty 进行映射。例如:

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    
    @JsonProperty("名称")
    private String name;

    @JsonProperty("年龄")
    private int age;

    @JsonProperty("性别")
    private String gender;

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

在这个例子中:

“名称” 对应 name 字段。
“年龄” 对应 age 字段。
“性别” 对应 gender 字段。
这样,当 JSON 数据中使用 “名称”、“年龄”、“性别” 作为键名时,Jackson 能正确地将其映射到 User 对象中。

2). 控制序列化和反序列化

@JsonProperty 可以指定字段在序列化或反序列化时应使用的名称:

public class User {
    
    @JsonProperty("名称")
    private String name;

    @JsonProperty("年龄")
    private int age;

    @JsonProperty("性别")
    private String gender;

    // 省略 getter 和 setter
}

当这个类被序列化为 JSON 时:

{
    "名称": "张三",
    "年龄": 30,
    "性别": "男"
}
3). 用于方法

你可以在 getter 或 setter 方法上使用 @JsonProperty,这允许你在保持字段名称不变的同时自定义 JSON 的键名:

public class User {
    
    private String name;

    @JsonProperty("姓名")
    public String getName() {
        return name;
    }

    @JsonProperty("姓名")
    public void setName(String name) {
        this.name = name;
    }
}

这样,name 字段会被映射为 “姓名”

4). 构造函数参数

@JsonProperty 也可以应用于构造函数参数,帮助 Jackson 在反序列化时识别 JSON 中的属性名:

public class User {

    private String name;
    private int age;

    public User(@JsonProperty("名称") String name, @JsonProperty("年龄") int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and Setters
}

当 Jackson 使用这个构造函数创建对象时,它会使用 "名称""年龄" 来识别 JSON 中的值。

三、优点

  • 灵活性:@JsonProperty 提供了极大的灵活性,允许你在不改变 Java 类字段名的情况下,自定义 JSON 数据的键名。
  • 广泛应用:它可以应用于类的字段、方法和构造函数,适用于各种序列化和反序列化需求。
  • 控制 JSON 输出:通过 @JsonProperty,你可以更精确地控制 JSON 的输出格式,确保数据与前端或其他系统的接口兼容。

这个注解在需要确保 JSON 数据结构与 Java 对象结构不同步时非常有用,尤其是在与外部系统集成时。

@JsonProperty失效的原因可能是因为项目同时引用了fastJson,而在项目中使用了FastJsonjson序列化。FastJson序列化时不会识别@JsonProperty注解。解决这个问题的方法有两种: 1. 在启动类上添加@EnableWebMvc注解,这样可以确保使用Jackson进行json序列化而不使用FastJson。 2. 如果不需要使用FastJson,可以直接在项目中移除对FastJson的引用。 在这种情况下,可以尝试在项目中使用@EnableWebMvc注解解决@JsonProperty失效的问题。将该注解添加到启动类上,例如在SpringBoot的启动类上添加@EnableWebMvc注解。这样做可以确保使用Jackson进行json序列化而不使用FastJson。如果项目中需要使用FastJson,那么可能需要重新考虑如何处理@JsonProperty注解失效的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [@JsonProperty 失效问题的排查](https://blog.csdn.net/m0_37948170/article/details/85327093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [详解关于使用媒体查询@meda失效原因的总结](https://download.csdn.net/download/weixin_38712416/12879385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值