解决JSON数据大小写,及@JsonProperty 和@JSONField序列化的区别

相信大家都有跟外部公司对接的经历,而只要跟外部对接不可避免地就会存在沟通上的不便利,比如说联调时发现两边属性有大小写的区别。

但是理论上开发前自己沟通不会出现这种问题,但是我最近遇到一个比较奇葩的对接,涉及三方对接,我的接口文档早就发出去了,然后我这边接口也是按照文档提供的属性字段定义的,代码也已经写完,然而到了对接的时候,对方说他跟另一方已经对接完,说我提供的文档有很多大小写不一致(那你早干嘛去了。。。文档都发出来个把星期了),虽然心里一万个不愿意,但是谁叫别人是甲方呢,忍忍还是自己改吧。

那么问题来了,实体与数据库已经建好了,再去改实体属性或者数据库字段显得很麻烦,那么有没有很简单的办法呢?

当然有,jackson包和fastjson包都提供了相应的办法解决。废话不多说,接下来直接说这两者的用法吧!

1.@JsonProperty注解方式

@JsonProperty注解是annotation包下的一个注解,可以通过value属性定义注解修饰的属性名称,如果你用的是@JsonProperty注解,那么你千万不要用JSONObject.toJSONString(实体)去转json,可能很多人在这里就蒙蔽了,为什么网上复制过来的转换不了,实际上很多文章只是复制粘贴,根本没有实际执行过,JSONObject.toJSONString(实体)实际上是fastjson包里面的方法,他不会处理@JsonProperty上设置的“别名”。正确的写法是:ObjectMapper().writeValueAsString(实体类)。

2.@JSONField注解方式

另外一种方法就是用fastjson包提供的@JSONField(当然这个注解还有很多其他功能,比如格式化时间等,这里不做阐述)。如果用了此注解的属性(或者set方法),那就需要用JSONObject.toJSONString(实体)(或者JSONObject.toJSONString(实体))。

示例代码:

public class SerializeTest {

    @JSONField(name = "gender")
    private String sex = "男";

    @JsonProperty(value = "name")
    private String userName = "张三";
    
    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public SerializeTest() {

    }

    public static void main(String[] args) throws Exception{
        String string = new ObjectMapper().writeValueAsString(new SerializeTest());
        System.out.println(string);
        String jsonString = JSONObject.toJSONString(new SerializeTest());
        System.out.println(jsonString);
    }
}
-----------------------------------------------
-----------------------------------------------
运行结果:
JsonProperty序列化:{"sex":"男","name":"张三"}
JSONField序列化:{"gender":"男","userName":"张三"}

另外补充一个知识:spring框架的@RequestBody默认使用fasterxml中的converter方法将body中的json转换为对象 所以应该使用@JsonProperty注解。

转载于:@JsonProperty 和@JSONField序列化的区别 - 知乎

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值