专栏首页chenchenchen序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName

序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName

@JSONField

主要用于返回出参转换

这个注解分别可以注解在实体类的属性、setter和getter方法上

public class Test{
	
	/*
		注解在属性上的时候可以设置一些序列化、格式化的属性
		@JSONField(serialize = false)---->序列化的时候忽略这个属性
		@JSONField(format = "yyyyMMdd")---->序列化和反序列化额时候使用yyyyMMdd,一般在Date类型的字段上使用
	*/	
	@JSONField(serialize = false)
	public String Name;

	/*
		注解在set方法表示json转成bean的时候会将json中的Name属性赋值给实体类的Name
	*/
	@JSONField(name="Name")
	public void setName(String Name){
		this.Name = Name;
	}

	/*
		注解在get方法表示bean转换成json的时候会把实体类的Name属性值赋给json的Name
	*/
	@JSONField(name="Name")
	public String getName(){
		return this.Name;
	}


}

@JsonProperty

主要用于入参转换,和Json字符串序列化为Java对象

@JsonPropertycom.fasterxml.jackson.annotation下使用频率很高的一个常用注解,用于将json字符串中的某个字段和java对象中的某个属性进行匹配映射,同时可以将java对象中的属性转换为指定字段的json字符串。

在java属性上加上@JsonProperty注解:

    @JsonProperty("jsonName")
    private String name;

测试

    @Test
    public void testJsonProperty() throws IOException{
        String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}";
        ObjectMapper mapper = new ObjectMapper();
        Object myBean1 = mapper.readerFor(MyBean.class).readValue(jsonBean1);
 
        System.err.println("Convert json to java: "+ myBean1.toString());
 
        MyBean myBean = new MyBean("xyz", "China", 12);
        System.err.println("Conver java to json: " + mapper.writeValueAsString(myBean));
    }

运行结果

@SerializedName

@SerializedNamecom.google.gson.annotations下的常用注解,作用和@JsonProperty差不多,重点是可以将多个字段名称映射到一个字段属性上

SerializedName 改变了默认序列化和默认反序列化的字段取值,所以,如果你使用 Gson 将 Java model 类生称 JSON 串,结果就是 value 的名称就是字段的名称。

SerializedName 接受两个参数,value、alternate,第一个value是默认参数,如果你只填了一个参数,那这个值将会赋值给 value。

alternate 属性是用在反序列化上的,也就是说从 JSON 到 Java 类的过程。Gson 会帮我们匹配 JSON 中的命名,并尝试找到一个字段映射。无论哪一个都会映射。

在java属性上加上@SerializedName注解:

    @SerializedName("jsonName", alternate = "json_name, json")
    private String name;

测试

    @Test
    public void testFromJeson() throws IOException {
        String jsonBean1 = "{\"jsonName\":\"xyz\",\"age\":\"12\",\"address\":\"china\"}";
        MyBean myBean = new MyBean("xyz", "China", 12);
 
        // 注意:写法和@JsonProperty不同
        Gson gson = new Gson();
        MyBean myBean1 = gson.fromJson(jsonBean1, MyBean.class);
        System.err.println("jesonBean1: "+ myBean1.toString());
 
        String toJson = gson.toJson(myBean);
        System.err.println("toJson: " + toJson);
    }

运行结果

@JsonProperty和@SerializedName对比

在Controller添加:

@RequestMapping("/student2")
public Student getStudentByJson(){
    Gson gson = new Gson();
    String studentJson = "{studentName:张三,studentAge:25}";
    Student  stu = gson.fromJson(studentJson,Student.class);
    return stu;
}

访问得到:

{"stuName":null,"stuAge":null}

加入@SerializedName注解

@Data
public class Student {
    @JsonProperty("stuName")
    @SerializedName("studentName")
    private String name;
    @SerializedName("studentAge")
    @JsonProperty("stuAge")
    private Integer age;
}

再次访问项目:

{"stuName":"张三","stuAge":25}

总结:

@JsonProperty使对象属性输出为@JsonProperty内的内容。

@SerializedName使对象属性序列化为想要的值

官网:

  1. https://www.baeldung.com/jackson-annotations
  2. http://www.javacreed.com/simple-gson-example/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java创建Annotation

    注解是Java很强大的部分,但大多数时候我们倾向于使用而不是去创建注解。例如,在Java源代码里不难找到Java编译器处理的@Override注解,Spring...

    银河1号
  • 走进Java接口测试之fastjson指南

    在上文 走进Java接口测试之理解JSON和XML基础 我们介绍了 JSON 的基础知识,本文我们深入研究阿里巴巴的开源 JSON 解析库 fastjson。

    高楼Zee
  • Gson 系列文章

    先来看一些序列化例子,Gson 中的序列化意味着将 Java 对象映射成 JSON 数据格式,在接下来的教程中,我们会逐步介绍一些更复杂的情况,首先来看一个简单...

    Remember_Ray
  • Jackson中@JsonProperty等常用注解

    1.@JsonProperty:此注解作用于属性上,作用是把该属性的名称序列化成另一个自己想要的名称

    Arebirth
  • [think in spring]spring mvc为什么默认使用jackson而不选择fastjson

    阿里的一些开源项目例如dubbo, druid, fastjson等在国内的影响力是蛮大的。今天谈下温少的fastjson, 它的流行源于它的快, 参考作者的谈...

    Zeal
  • fastjson:差点被几个漏洞毁了一世英名

    我是 fastjson,是个地地道道的杭州土著,但我始终怀揣着一颗走向全世界的雄心。这不,我在 GitHub 上的简介都换成了英文,国际范十足吧?

    沉默王二
  • Jackson第一篇

    Spring中已引入jackson相关依赖,无须在pom中再引入相关依赖,若再引入相关依赖,则会报错创建bean异常。

    关忆北.
  • 吃透FastJSON,认准此文!

    大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!死鬼~看完记得给我来个三连哦!

    蔡不菜丶
  • 都是微服务的天下了,还有不知道 JSON 的程序员吗?

      JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协...

    Demo_Null
  • Jsonfield注解的使用

    工作中与前端的数据交换使用的协议是json+protobuf,主要是用protobuf。

    呼延十
  • HandlerMethodArgumentResolver(四):自定参数解析器处理特定应用场景,介绍PropertyNamingStrategy的使用【享学Spring MVC】

    前面通过三篇文章介绍了HandlerMethodArgumentResolver这个参数解析器以及它的所有内置实现,相信看过的小伙伴对它的加载、初始化、处理原理...

    YourBatman
  • Jackson快速入门

    Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的...

    乐百川
  • 序列化与反序列化核心用法-JSON框架Jackson精解第一篇

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架...

    字母哥博客
  • Google Gson用法详解

    Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串...

    三分恶
  • FastJson 笔记

    观察该类的继承与实现关系,不难发现,JSONObject 实现了 Map 接口,而 json 对象中的数据都是以”键:值”对形式出现,可以猜想, JSONObj...

    Remember_Ray
  • FastJson 笔记

    观察该类的继承与实现关系,不难发现,JSONObject 实现了 Map 接口,而 json 对象中的数据都是以”键:值”对形式出现,可以猜想, JSONObj...

    Remember_Ray
  • Jackson常用注解详解1 初级2 中级

    JavaEdge
  • 除了FastJson,你也应该了解一下Jackson(二)

    上一篇文章介绍了Jackson中的映射器ObjectMapper,以及如何使用它来实现Json与Java对象之间的序列化和反序列化,最后介绍了Jackson中一...

    东溪陈姓少年
  • Java序列化对字段名的影响

    前段时间遇到一个问题,序列化之后原本类中的属性名发生了变化,原本isDel序列化之后得到的是del,为此查了一下相关资料,发现和序列化机制有关

    二十三年蝉

扫码关注云+社区

领取腾讯云代金券