JSON_常用类JSON与对象的互相转换TypeReference泛型遇到的坑
Posted 所得皆惊喜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON_常用类JSON与对象的互相转换TypeReference泛型遇到的坑相关的知识,希望对你有一定的参考价值。
文章目录
- ①. fastJson - 常用类
- ②. 定义 - JSON格式
- ③. 简单对象与JSON转换
- ④. 数组类型与JSONArray
- ⑤. 复杂json格式转换
- ⑥. JSON与javaBean转换
- ⑦. TypeReference泛型
- ⑧. JSON.toJSONString的坑
①. fastJson - 常用类
- ①. fastJson对于json格式字符串的解析主要用到了一下三个类:
- JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换
- JSONObject:fastJson提供的json对象。可以把JSONObject当成一个Map<String,Object>来看,只是JSONObject提供了更为丰富便捷的方法,方便我们对于对象属性的操作
- JSONArray:fastJson提供json数组对象,把JSONArray当做一个List,可以把JSONArray看成JSONObject对象的一个集合
此外,由于JSONObject和JSONArray继承了JSON,所以说也可以直接使用两者对JSON格式字符串与JSON对象及javaBean之间做转换,不过为了避免混淆我们还是使用JSON
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.80</version>
</dependency>
②. 定义 - JSON格式
- ②. 首先定义三个json格式的字符串,作为我们的数据源
//json字符串-简单对象型
String JSON_OBJ_STR = "\\"studentName\\":\\"lily\\",\\"studentAge\\":12";
//json字符串-数组类型
String JSON_ARRAY_STR = "[\\"studentName\\":\\"lily\\",\\"studentAge\\":12,\\"studentName\\":\\"lucy\\",\\"studentAge\\":15]";
//复杂格式json字符串
String COMPLEX_JSON_STR = "\\"teacherName\\":\\"crystall\\",\\"teacherAge\\":27,\\"course\\":\\"courseName\\":\\"english\\",\\"code\\":1270,\\"students\\":[\\"studentName\\":\\"lily\\",\\"studentAge\\":12,\\"studentName\\":\\"lucy\\",\\"studentAge\\":15]";
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
③. 简单对象与JSON转换
- ③. json字符串-简单对象型与JSONObject之间的转换
/**
* json字符串-简单对象型与JSONObject之间的转换
*/
public static void testJSONStrToJSONObject()
JSONObject jsonObject = JSON.parseObject(JSON_OBJ_STR);
//JSONObject jsonObject1 = JSONObject.parseObject(JSON_OBJ_STR); //因为JSONObject继承了JSON,所以这样也是可以的
System.out.println(jsonObject.getString("studentName")+":"+jsonObject.getInteger("studentAge"));
④. 数组类型与JSONArray
- ④. json字符串-数组类型与JSONArray之间的转换
/**
* json字符串-数组类型与JSONArray之间的转换
*/
public static void testJSONStrToJSONArray()
JSONArray jsonArray = JSON.parseArray(JSON_ARRAY_STR);
//JSONArray jsonArray1 = JSONArray.parseArray(JSON_ARRAY_STR);//因为JSONArray继承了JSON,所以这样也是可以的
//遍历方式1
for (int i = 0; i < jsonArray.size(); i++)
JSONObject jsonObject = jsonArray.getJSONObject(i);
System.out.println(jsonObject.getString("studentName")+":"+jsonObject.getInteger("studentAge"));
//遍历方式2
for (Object obj : jsonArray)
JSONObject jsonObject = (JSONObject) obj;
System.out.println(jsonObject.getString("studentName")+":"+jsonObject.getInteger("studentAge"));
⑤. 复杂json格式转换
- ⑤. 复杂json格式字符串与JSONObject之间的转换
/**
* 复杂json格式字符串与JSONObject之间的转换
*/
public static void testComplexJSONStrToJSONObject()
JSONObject jsonObject = JSON.parseObject(COMPLEX_JSON_STR);
//JSONObject jsonObject1 = JSONObject.parseObject(COMPLEX_JSON_STR);//因为JSONObject继承了JSON,所以这样也是可以的
String teacherName = jsonObject.getString("teacherName");
Integer teacherAge = jsonObject.getInteger("teacherAge");
JSONObject course = jsonObject.getJSONObject("course");
JSONArray students = jsonObject.getJSONArray("students");
⑥. JSON与javaBean转换
- ⑥. JSON格式字符串与javaBean之间的转换
@Data
public class Student
private String studentName;
private Integer studentAge;
@Data
public class Course
private String courseName;
private Integer code;
public class Teacher
private String teacherName;
private Integer teacherAge;
private Course course;
private List<Student> students;
/**
* json字符串-简单对象与JavaBean_obj之间的转换
*/
public static void testJSONStrToJavaBeanObj()
Student student = JSON.parseObject(JSON_OBJ_STR, new TypeReference<Student>() );
//Student student1 = JSONObject.parseObject(JSON_OBJ_STR, new TypeReference<Student>() );//因为JSONObject继承了JSON,所以这样也是可以的
System.out.println(student.getStudentName()+":"+student.getStudentAge());
/*
* json字符串-数组类型与JavaBean_List之间的转换
*/
public static void testJSONStrToJavaBeanList()
ArrayList<Student> students = JSON.parseObject(JSON_ARRAY_STR, new TypeReference<ArrayList<Student>>() );
//ArrayList<Student> students1 = JSONArray.parseObject(JSON_ARRAY_STR, new TypeReference<ArrayList<Student>>() );//因为JSONArray继承了JSON,所以这样也是可以的
for (Student student : students)
System.out.println(student.getStudentName()+":"+student.getStudentAge());
/**
* 复杂json格式字符串与JavaBean_obj之间的转换
*/
public static void testComplexJSONStrToJavaBean()
Teacher teacher = JSON.parseObject(COMPLEX_JSON_STR, new TypeReference<Teacher>() );
//Teacher teacher1 = JSON.parseObject(COMPLEX_JSON_STR, new TypeReference<Teacher>() );//因为JSONObject继承了JSON,所以这样也是可以的
String teacherName = teacher.getTeacherName();
Integer teacherAge = teacher.getTeacherAge();
Course course = teacher.getCourse();
List<Student> students = teacher.getStudents();
⑦. TypeReference泛型
- ⑦. 对于TypeReference,由于其构造方法使用protected进行修饰,所以在其他包下创建其对象的时候,要用其实现类的子类:new TypeReference()
⑧. JSON.toJSONString的坑
- ⑧. JSON.toJSONString的坑:在使用fastjson中的JSON.toJSONString方法将对象转换成json字符串的时候,发现有些字段没有了。如:
public static void main(String[] args)
Map<String,Object>map=new HashMap<>();
map.put("id","1");
map.put("name",null);
System.out.println(JSON.toJSONString(map));
//输出结果: "id":"1" 输出结果中没有了 "name"这个属性了;
//加SerializerFeature.WriteMapNullValue)
public static void main(String[] args)
Map<String,Object>map=new HashMap<>();
map.put("id","1");
map.put("name",null);
System.out.println(JSON.toJSONString(map,SerializerFeature.WriteMapNullValue));
//输出结果: "name":null,"id":"1"
以上是关于JSON_常用类JSON与对象的互相转换TypeReference泛型遇到的坑的主要内容,如果未能解决你的问题,请参考以下文章