FastJson——JSO字符串与对象的相互转化

FastJson——JSO字符串与对象的相互转化Fastjson 是阿里巴巴的开源 SON 解析库它可以解析 JSON 格式的字符串 从 2011 年 fastjson 发布 1 1 版本之后其性能从未被其他 ava 实现的 SON 库超越 fastjson 在阿里巴巴大规模使用 在数万台

大家好,欢迎来到IT知识分享网。

一、FastJson介绍

​ Fastjson是阿里巴巴的开源SON解析库它可以解析JSON格式的字符串,支持将java Bean序列化为ISON字符串,也可以从JSON字符串反序列化到JavaBean。

Fastjson的优点

  • 速度快
    fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.版本之后其性能从未被其他ava实现的]SON库超越
  • 使用广泛
    fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一
  • 测试完备
    fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定
  • 使用简单
    fastison的API十分简洁
  • 功能完备
    支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展

二、FastJson序列化 API

序列化: 将Java对象转换成JSON格式字符串的过程。

2.1 JSON对象转换成字符串

使用 JSON.toJSONString(Object object); 方法

public class ObjectToJSON { 
    public static void main(String[] args) { 
    Student student = new Student("张三",20,"北京市",""); String jsonString = JSON.toJSONString(student); System.out.println(jsonString); } } 
@Data @AllArgsConstructor @NoArgsConstructor public class Student { 
    private String name; private Integer age; private String address; private String email; } 

image-20230403171538032

2.2 List集合转换成JSON对象

使用 JSON.toJSONString(Object object); 方法

Student student1 = new Student("张三",20,"北京市",""); Student student2 = new Student("张三",20,"北京市",""); Student student3 = new Student("张三",20,"北京市",""); Student student4 = new Student("张三",20,"北京市",""); ArrayList<Student> list = new ArrayList<>(); list.add(student1); list.add(student2); list.add(student3); list.add(student4); String jsonString = JSON.toJSONString(list); System.out.println(jsonString); 

image-20230403172132984

2.3 Map集合转换成JSON对象

Map<String, Student> map = new HashMap<>(); Student student1 = new Student("张三", 20, "北京市", ""); Student student2 = new Student("张三", 20, "北京市", ""); Student student3 = new Student("张三", 20, "北京市", ""); Student student4 = new Student("张三", 20, "北京市", ""); map.put("1",student1); map.put("2",student2); map.put("3",student3); map.put("4",student4); String jsonString = JSON.toJSONString(map); System.out.println(jsonString); 

image-20230403172608170

三、FastJSON反序列化

将JSON格式的字符串转换成Java对象

3.1 JSON字符串转Object对象

JSON.parseObject(JSON字符串, 要转换成的类.class);

 String jsonString = "{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"}"; // 第一个参数传入JSON字符串,第二个参数传入我们要转换成的对象的类 Student student = JSON.parseObject(jsonString, Student.class); System.out.println(student); 

image-20230403173718274

3.2 JSON字符串转List集合

JSON.parseArray(json格式字符串, 传递转换后的集合的泛型); 
 String jsonString = "[{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"},{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"},{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"},{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"}]"; // 第一个参数传递JSON格式字符串,第二个参数传递转换后的集合的泛型 List<Student> studentsList = JSON.parseArray(jsonString, Student.class); System.out.println(studentsList); 

image-20230403174042963

3.3 JSON字符串转Map集合

 String jsonString = "{\"1\":{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"},\"2\":{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"},\"3\":{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"},\"4\":{\"address\":\"北京市\",\"age\":20,\"email\":\"\",\"name\":\"张三\"}}"; // 直接进行反序列化,Map集合是没有泛型的,也是可以正常输出的,但是没有泛型的集合是不安全的集合 // Map map = JSON.parseObject(jsonString); // 下面掉用户parseObject,传递参数TypeReference类型,在TypeReference的泛型中传递转后的Map集合即可 // {}是什么意思? 因为TypeReference的构造方法是protected修饰的,只有子类才能调用,但是我们现在不是他的子类,在后面加{}让其在这成为匿名内部类,匿名内部类就是该类的子类对象 Map<String, Student> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Student>>() { 
    }); System.out.println(map); 

image-20230403175356986

四、JSONObject对象

4.1 JSON字符串转换成JSONObject

JSONObject jsonObject = JSON.parseObject("JSON 字符串"); 

4.2 从JSONObject中得到某一个封装数据

{ 
    "body":{ 
    "createBy":0, "aaa0":"sssss", "updateBy":0, "userId":10086, "userCode":"" } } 
// 将字符串转换成JSONObject JSONObject responseObj = JSON.parseObject("{"body":{"createBy":0,"aaa0":"sssss","updateBy":0,"userId":10086,"userCode":""}}"); //获取body对象 JSONObject body = responseObj.getJSONObject("body"); //获取body里面的某个数据 String userCode = body.getString("userCode"); 

4.3 将JSONObject对象中的key按照ASCII排序

// 按照ASCII码排序字段 public String sortByASCII(String jsonStr) { 
    //创建JSONObject JSONObject jsonObject = JSON.parseObject(jsonStr); // 将JSONObject转换为Map对象 Map<String, Object> innerMap = jsonObject.getInnerMap(); // 创建一个新的TreeMap并将元素复制到其中 TreeMap<String, Object> treeMap = new TreeMap<>(innerMap); // 创建一个新的JSONObject并使用TreeMap更新它 JSONObject sortedJsonObject = new JSONObject(treeMap); return sortedJsonObject.toString(); } 

五、关于将JSONObject之前返回前端的问题

今天我将一个String类型的数据转换成JSONObject类型数据并且直接返回给了前端,发现前端怎么也调不通,我日志中的JSON数据也并没有什么问题,下面来探析一下

不用探析了,一个很傻逼的问题

Controller层封装了一下结果集,然后Service层又封装了一下结果集导致的

六、常用注解

@JsonProperty 注解和 @JSONField 注解

6.1 @JSONField

这个字段在序列化和反序列化中都能实现实体类与JSON属性对应,下面只是举了序列化的例子而已,千万要记住反序列化也能成功

反序列化: JSON数据转换成实体类时

6.1.1 指定字段在生成的JSON中的名称

使用场景:某一个字段是大写,但是我们转成JSON后变成小写,如下所示

@Data @NoArgsConstructor @AllArgsConstructor public class GetIdentityIdDto implements Serializable { 
    private static final long serialVersionUID = L; @NotBlank private String identityCard; @NotBlank private String Sex; } 

将上面的dto转成JSON

GetIdentityIdDto dto = new GetIdentityIdDto("111","222"); String toJSONString = JSONObject.toJSONString(dto); System.out.println(toJSONString); 

输出结果,可以看出来“Sex”字段首字母变成小写了

{ 
    "identityCard":"111", "sex":"222" } 

解决方案:通过@JSONField的name属性指定字段在生成的JSON中的名称

@Data @NoArgsConstructor @AllArgsConstructor public class GetIdentityIdDto implements Serializable { 
    private static final long serialVersionUID = L; @NotBlank private String identityCard; @NotBlank @JSONField(name = "Sex") private String Sex; } 

效果

{ 
    "Sex":"222", "identityCard":"111" } 

6.1.2 ordinal属性指定字段的序列化顺序

@Data @NoArgsConstructor @AllArgsConstructor public class GetIdentityIdTestDto implements Serializable { 
    private static final long serialVersionUID = L; @NotBlank @JSONField(name = "identityCard",ordinal = 2) private String identityCard; @NotBlank @JSONField(name = "Sex",ordinal = 1) private String Sex; } 

输出的JSON串数据

GetIdentityIdTestDto dto = new GetIdentityIdTestDto("111","222"); String toJSONString = JSONObject.toJSONString(dto); System.out.println(toJSONString); 

确实是”Sex”字段在前

{ 
   "Sex":"222","identityCard":"111"} 

那我们改一下dto的顺序

 @NotBlank @JSONField(name = "identityCard",ordinal = 1) private String identityCard; @NotBlank @JSONField(name = "Sex",ordinal = 2) private String Sex; 

输出顺序

{ 
   "identityCard":"111","Sex":"222"} 

6.1.3 format属性

@Data @NoArgsConstructor @AllArgsConstructor public class GetIdentityIdTestDto implements Serializable { 
    private static final long serialVersionUID = L; @NotBlank @JSONField(name = "identityCard",ordinal = 1) private String identityCard; @NotBlank @JSONField(name = "Sex",ordinal = 2) private String Sex; @JSONField(format="yyyy-MM-dd HH:mm:ss") private Date date; } 

输出一下

GetIdentityIdTestDto dto = new GetIdentityIdTestDto("111","222",new Date()); System.out.println(new Date()); String toJSONString = JSONObject.toJSONString(dto); System.out.println(toJSONString); System.out.println(dto.getDate()); 

format属性只是在转JSON的时候进行format,我们如果获取此字段对应的属性的话,还是原来的值

image-20230831083401980

@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”)与@JSONField(format=“yyyy-MM-dd HH:mm:ss”)的区别

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119010.html

(0)
上一篇 2025-11-08 18:10
下一篇 2025-11-08 18:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信