首页 > 编程语言 >序列化Java对象重命名字段,@JSONField、@JsonProperty、@SerializedName

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

时间:2023-05-31 13:11:28浏览次数:47  
标签:JsonProperty JSONField Name json SerializedName 序列化 String

@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对象

    @JsonProperty是com.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

    @SerializedName是com.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使对象属性序列化为想要的值

官网:

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

标签:JsonProperty,JSONField,Name,json,SerializedName,序列化,String
From: https://www.cnblogs.com/Fooo/p/17445829.html

相关文章

  • 权限控制,美化admin,签发token逻辑,放在序列化类中写
    1权限控制#ACL(访问控制列表)的权限控制:(针对互联网用户的产品) 用户表idnamepassword1zhangsan123权限表iduser_id权限11评论权限21发抖音权限张三:[评论权限,发抖音权限]#R......
  • hadoop序列化相关问题
    什么时候需要使用序列化?需要在不同服务器传递内存数据时,用序列化。序列化后的所有属性需要再反序列化,那么有先后顺序反序列化吗?有的,比如序列化的属性有abc则反序列化的属性必须是cabc数据切片一般为数据块的倍数,为什么?一般一个数据切片对应启动一个maptask任务,可以保证......
  • C++文件流结构体序列化,并查集,LRU缓存
    c语言中的文件操作中用fprintf将数据写入到文件中,用fscanf将文件读入内存中,而c++中也有ostream和istream作为键盘流输入,屏幕流输出,对于文件也有ofstream/istream来进行相关的操作.如图:图中表示将一个结构体的的数据输入到文件中,并从文件中读取数据,并用得到的数据初始化一......
  • 什么是java序列化?什么情况下需要序列化?
    Java序列化是一种将对象转换为字节流的过程,使得对象可以在网络上传输或存储到文件系统中,同时也可以将字节流重新转换回对象的过程。通过序列化,可以将对象的状态保存下来,并在需要的时候恢复对象的状态。在Java中,通过实现Serializable接口,即可使一个类具备序列化的能力。序列化使用O......
  • 1004.Django项目用户功能之关联序列化及访问限流
    一、路由器1.SimpleRouter该路由器包括标准集合——list、create、retrieve、update、partial_update、destroy动作的路由。视图集中还可以使用@detail_route或@list_route装饰器标记要被路由的其他方法;2.DefaultRouter这个路由器类似于上面的SimpleRouter,但是还包括一个默......
  • Java序列化和反序列化
    序列化和反序列化的定义*Java序列化就是指把Java对象转换为字节序列的过程*Java反序列化就是指把字节序列恢复为Java对象的过程。 以下是我们常见的一行代码:privatestaticfinallongserialVersionUID=1L;关于这行代码,这是java源码中的一段话:如果可序列化类没有显......
  • 自定义注解实现数据序列化时进行数据脱敏(基于springboot默认jackjson)、消息转换器
    消息转换器fastjson与jackjson问题在springboot中使用fastjson的@jsonField无效原因:在springboot默认有json(jackjson)解析工具,所以使用fastjson不会生效解决方案替换默认的解析工具(笔者不推荐,这里根据自己项目决定)fastjson替换默认的jackjson第一种方法bean方法packagecom......
  • 【web 开发】PHP8中数组的序列化和反序列化
    前言数组的序列化(serialize)用来将数组的数据转换为字符串,以方便传递和数据库的存储。与之相对应的操作就是反序列化(unserialize),把字符串数据转换为数组加以使用。数组的序列化主要通过serialize()函数来完成。字符串的反序列化主要通过unserialize()函数来完成。对象的序列化与反序......
  • php反序列化逃逸
    之前就对字符串逃逸这一块理解的不是很深刻,下面通过一位师傅的博客来进一步深入理解一下有关php字符串逃逸的相关内容。贴上师傅的博客地址:https://blog.csdn.net/qq_45521281/article/details/107135706先来说一下什么是字符串逃逸,就是我们可以构造一些恶意代码,让其在反序列化......
  • System.Text.Json匿名对象反序列化
    以前就是一直使用Newtonsoft.Json用起来还是挺舒服的。由于JSON的应用越来越广,现在.NETCore都内置了System.Text.Json可以直接对JSON进行操作,不过两个东西的体验依然有点区别。有时候我们会遇到的从第三方传递过来的jsonstring对象,对其进行解析并不需要所有的字段,......