fastjson提供了一整套方便将一个对象和json字符串来回转换的工具类,熟练的掌握这个工具不仅可以使我们的代码看起来更加优雅流畅,还能减轻系统的压力。时至今日,json已经成为程序开发中不可或缺的一部分,本文将以alibaba的fastjson为例,根据实际开发需要提供一整套解决方法。

首先,我们先引入开发所需要的jar包依赖,我使用的是1.2.27版本,大家可以根据自己实际开发需要自行引入相应的版本。

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.27</version>
</dependency>

一、json与对象互转

先新建个Student对象

public class Student {//姓名private String name;//年龄private String age;//性别private String sex;//地址private String address;//生日private Date birthday;
}

1.1、对象转json

Student stu = new Student();
stu.setName("张三");
stu.setSex("男");
stu.setAge("18");
stu.setAddress("浙江");
stu.setBirthday(new Date());
//对象转json
String json = JSON.toJSONString(stu);

1.2、json转对象

//json转Student对象
Student student = JSON.parseObject(json, Student.class);

1.3、对象与json互转时常用方法

1.3.1、@JSONField

在对象与json互转过程中经常会有某些特殊的需求,比如不想要某些属性,改变某些属性的值或者其他逻辑。

public class Student {//姓名@JSONField(name="NAME", serialize=false)//JSONField是fastjson下的一个注解,name:指定序列化后的属性值为NAME,//serialize:默认为true,false为不序列化该属性private String name;//年龄@JSONField(name="AGE", deserialize=false)//deserialize:默认为true,false为不反序列化该属性private String age;//性别@JSONField(name="SEX", ordinal=1)//ordinal:指定SEX属性的顺序为1private String sex;//地址@JSONField(name="ADDRESS", ordinal=2)//ordinal:指定ADDRESS属性的顺序为2private String address;//生日@JSONField(name="BIRTHDAY", format="dd/MM/yyyy", ordinal = 3)//ordinal:指定BIRTHDAY属性的顺序为3//format:只能用于Date类型,格式化Date属性private Date birthday;
}

1.3.2、ContextValueFilter

        ContextValueFilter是fastjson提供的接口,在操作时可以创建新的实现类去操作需要获得所属JavaBean的信息,包括类型、字段、方法等,并且对上下文进行相关的逻辑操作。
Student stu = new Student();
stu.setName("张三");
stu.setSex("男");
stu.setAge("18");
stu.setAddress("浙江");
stu.setBirthday(new Date());
ContextValueFilter filter = new ContextValueFilter() {@Overridepublic Object process(BeanContext beanContext, Object o, String s, Object o1) {//将key为AGE的值改成小写if (StringUtils.equals(s, "AGE")) {return s.toUpperCase();}//将SEX对应的值改成false(StringUtils.equals(s, "SEX")) {return false;}//如果value值为String,拼接上filterif (o1 instanceof String) {String key = (String) o1;return key + "filter";}return null;}
};
String json = JSON.toJSONString(stu, filter);
//json ==> {"SEX":false,"AGE":"age","ADDRESS":"浙江filter"}
System.out.println(json);

二、json与List互转

2.1、list里面为string

list转json:

List<String> strings = new ArrayList<>();
strings.add("aa");
strings.add("bb");
strings.add("cc");
String stringJson = JSON.toJSONString(strings);
//stringJson ==> ["aa","bb","cc"]
System.out.println(stringJson);

json转list

List<String> list = JSON.parseArray(stringJson, String.class);

2.2、list里面为对象

List<Student> studentList = new ArrayList<>();
Student stu = new Student();
stu.setName("张三");
stu.setSex("男");
stu.setAge("18");
stu.setAddress("浙江");
stu.setBirthday(new Date());
studentList.add(stu);
String stuJson = JSON.toJSONString(studentList);
//stuJson ==> [{"SEX":"男","AGE":"18","ADDRESS":"浙江","BIRTHDAY":"04/01/2022"}]
System.out.println(stuJson);
List<Student> students = JSON.parseArray(stuJson, Student.class);

三、map与json互转

map转json

Map<String,String> map = new HashMap<>();
map.put("a","aa");
map.put("b","bb");
map.put("c","cc");
String mapJson = JSON.toJSONString(map);
//mapJson ==> {"a":"aa","b":"bb","c":"cc"}
System.out.println(mapJson);

json转map

Map<String,String> originMap = JSON.parseObject(mapJson, Map.class);
String a = originMap.get("a");
System.out.println(a);

四、JSONObject与json

JSONObject是fastjson提供的一个对象,本质上是实现了Map<String, Object>,并且继承了JSON。可以这样理解,json格式的string对象是一个Map<String, Object>,我们在使用JSON.parseObject()进行转换的时候没有指定键值对中value的类型,所以用Object填充,因此获得的结果就是JSONObject,如果指定了对象那么返回值就是我们指定的对象。

JSONObject转json

JSONObject jsonObject = new JSONObject();
jsonObject.put("a","aa");
String jsonString = jsonObject.toJSONString();
//jsonString ==> {"a":"aa"}
System.out.println(jsonString);

json转JSONObject

JSONObject originJsonObject = JSON.parseObject(jsonString);
String a = (String) originJsonObject.get("a");
//a ==> aa
System.out.println(a);

五、TypeReference

TypeReference也是fastjson提供的一个对象,这个对象的目的是指定反序列化时的对象类型

Map<String, Map<String, List<Student>>> map = new HashMap<>();
Map<String, List<Student>> innerMap = new HashMap<>();
List<Student> studentList = new ArrayList<>();
Student stu = new Student();
stu.setName("张三");
stu.setSex("男");
stu.setAge("18");
stu.setAddress("浙江");
stu.setBirthday(new Date());
studentList.add(stu);
innerMap.put("studentList", studentList);
map.put("innerMap", innerMap);
String mapJson = JSON.toJSONString(map);
//mapJson ==> {"innerMap":{"studentList":[{"SEX":"男","AGE":"18","ADDRESS":"浙江","BIRTHDAY":"04/01/2022"}]}}
System.out.println(mapJson);
Map<String, Map<String, List<Student>>> origin = JSON.parseObject(mapJson, new TypeReference<Map<String, Map<String, List<Student>>>>(){});
System.out.println(origin);

六、总结

根据java的一切皆对象来说,不管是String、List、Map还是对象都是对象,因此转成json的string都可以使用JSON.toJSONString(obj)

/*** json格式化* @param obj* @return*/
public static String toJsonString(Object obj) {return JSON.toJSONString(obj);
}

而将json的string转化成对象,根据其本质(json的string本质可以理解成Map<String, Object>)可以分成两种,一种是对象(包括Map、String、Object等),一种是list(list本身也是对象)

  /*** 解析json** @param json* @param clazz* @param <T>* @return*/public static <T> T parseObject(String json, Class<T> clazz) {if (StringUtils.isBlank(json)) {return null;}Assert.notNull(clazz);return JSON.parseObject(json, clazz);}/*** 解析json数组* @param json* @param clazz* @param <T>* @return*/public static <T> List<T> parseArray(String json, Class<T> clazz) {if (StringUtils.isBlank(json)) {return Collections.emptyList();}Assert.notNull(clazz);return JSON.parseArray(json, clazz);}

因此在json的string转化成对象时尽可能的使用对象接收,如果不用对象接收也要尽可能的使用TypeReference指定转换后的类型。

fastjson类型转换大全相关推荐

  1. vc数据类型转换大全

    vc数据类型转换大全 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君& ...

  2. java类型转换_JAVA类型转换大全

    Java自带的库很多用起来都不是那么方便,类型转换很多都要显示去做真的有点难记住.找了篇资料说的很详细,记录下来吧. integer   to   String   :         int   i ...

  3. Java中数据类型转换大全(个人总结)

    一.字符串转换为其他类型 1.将字符串转化为int型 (1)方法一 int i = Integer.parseInt(String str); (2)方法二 int i = Integer.value ...

  4. VC++类型转换大全

    Cpp代码   int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君&quo ...

  5. VC++数据类型转换大全

    Cpp代码   int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君&quo ...

  6. js操作符类型转换大全

    //操作符字符串的隐性转换//乘法 console.dir("-------以下乘法---------"); console.dir(5*"5"); conso ...

  7. fastjson转换大全

    字符串转json: /*** 将一个json字符串转换成json对象*/public static JSONObject stringToJson(String json){JSONObject js ...

  8. Qt数据类型转换大全

    参考:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中数据类型的转换很常用,于是边使用边记录,有不完整的,后边再慢慢补充完善 Qt中 ...

  9. CString彻底分析,很强悍的啊

    转自:http://wmnmtm.blog.163.com/blog/static/3824571420113673647595/?suggestedreading&wumiiCString ...

最新文章

  1. 今晚直播写代码|英伟达工程师亲授如何加速YOLO目标检测
  2. [FxCop.设计规则]13. 定义自定义属性参数的访问属性
  3. ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
  4. Linux下暴力破解工具Hydra详解
  5. 时间模块,带Python示例
  6. 微信平台开发应用的签名
  7. php post提交函数,PHP curl get post 提交函数
  8. 老李分享:性能测试过程
  9. nginx配置错误页面的2种方式
  10. Mybatis学习笔记(二)
  11. 使用UDP实现群聊聊天室
  12. python画图时设置分辨率和画布大小-plt.figure()
  13. 《SysML精粹》学习记录--第一章
  14. 【算法】Regular Expression Matching 正则匹配
  15. python entry高度_Python2.7.3 Tkinter Entry(文本框) 说明
  16. corn表达式的使用
  17. sql server 可更新订阅 配置_更新前瞻丨前瞻内容大放送,暗部行动再次开启!
  18. EmailEditView的实现(仿知乎邮箱登录效果)
  19. OpenMV 机器视觉模块 简介
  20. 马的Hamilton周游路线问题

热门文章

  1. 在iOS中集成ZXing实现二维码扫描
  2. python解析照片拍摄时间和地点信息
  3. 2020-02-27 ASW Root登录
  4. 抄的第一个项目数独游戏
  5. python气象分析
  6. 简易下载并使用Jupyter(Anaconda)
  7. Hive,sha256,md5实例
  8. IRIS 2021 技术文档 First Look 28 - InterSystems 公钥基础设施 (PKI)
  9. 中国电子学会研究咨询中心主任李颋:AI产业发展的趋势、挑战及政策建议
  10. Excel 使用正则表达式替换字符串