JSON学习
第一章
fastjson
import com.alibaba.fastjson import com.alibaba.fastjson.JSON;
pom依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
简介
这个包里面最主要也是最常用的两个类是 JSON JSONObject 这两个类也都是内部使用的是final map 来实现的。构造的时候可以传入一个ordered。来确定使用LinkedHashMap还是HashMap。看下面这个构造。还可以使用map入参来构造jsonObject。也可以看到jsonobject实际上是json的子类。有一个特征就是 jsonObject是没有static方法的。我们打点出来的静态方法都是JSON那边继承过来的。就不往深挖源码了,知道大概就好。
测试1:
关于json字符串转对象和字符串转json. JavaBean、Collection、Map、Date、Enum、都可以
测试2:
parseArray(jsonStr,Class) List jsonArray跟List一样
JSONObject 实现了Map 接口。看下面方法好多跟map瞅着一样
下面为例子json。data的value可以看成List persion有name属性。 instance可以看成Map(对象的json字符串形式)
测试一代码如下:
@Test public void myTest(){ Person person = new Person(); person.setName("郭洋"); person.setAge(23); String str = JSON.toJSONString(person);// 把对象转化成json字符串 System.out.println(str); // 输出:{"age":23,"name":"郭洋"} // 这个方法可以将Json字符串转成任意的javabean、Map、集合也可以。 // 不指定后面的class就会转成JSONobject, // 若指定转成那个class,前面就要用那个class的实例去接收 Person person1 = JSON.parseObject(str,person.getClass());// 转成Person类的实例对象 System.out.println(person1);// Person(name=郭洋, age=23) JSONObject jsonObject = JSON.parseObject(str);// 不指定json字符串要转成那个class对象实例,默认转成JSONObject对象实例 System.out.println(jsonObject);// {"name":"郭洋","age":23} Map<Integer,Double> map = new HashMap<>(); map.put(1,1.2); map.put(2,1.2); map.put(3,1.2); map.put(4,1.2); String strMap = JSON.toJSONString(map);// 将Map转成json字符串 System.out.println(strMap);// {1:1.2,2:1.2,3:1.2,4:1.2} Map strMap1 = JSON.parseObject(strMap);// 将json字符串转化成map对象 System.out.println(strMap1);// {"1":1.2,"2":1.2,"3":1.2,"4":1.2} } // 输出: //{"age":23,"name":"郭洋"} //Person(name=郭洋, age=23) //{"name":"郭洋","age":23} //{1:1.2,2:1.2,3:1.2,4:1.2} //{"1":1.2,"2":1.2,"3":1.2,"4":1.2}
测试二代码如下:
@Test public void myTest2(){ Person person = new Person(); person.setName("郭洋2"); person.setAge(22); Person person1 = new Person(); person1.setName("郭洋1"); person1.setAge(21); List<Person> personList = new ArrayList<>(); personList.add(person); personList.add(person1); String str = JSON.toJSONString(personList);// 将List转成Json字符串 System.out.println(str);// [{"age":22,"name":"郭洋2"},{"age":21,"name":"郭洋1"}] System.out.println("*****************************"); List list = JSON.parseObject(str,personList.getClass());// 将json字符串转化成数组对象 for (Object o : list) { System.out.println(o); //{"name":"郭洋2","age":22} //{"name":"郭洋1","age":21} } System.out.println("*****************************"); JSONArray objects = JSON.parseArray(str);// 将json字符串转化成JSONArray对象 System.out.println(objects);// [{"name":"郭洋2","age":22},{"name":"郭洋1","age":21}] System.out.println("*****************************"); List<Person> personList1 = JSON.parseArray(str,Person.class); System.out.println(personList1);// [Person(name=郭洋2, age=22), Person(name=郭洋1, age=21)] System.out.println("*****************************"); } //输出: //[{"age":22,"name":"郭洋2"},{"age":21,"name":"郭洋1"}] //***************************** //{"name":"郭洋2","age":22} //{"name":"郭洋1","age":21} //***************************** //[{"name":"郭洋2","age":22},{"name":"郭洋1","age":21}] //***************************** //[Person(name=郭洋2, age=22), Person(name=郭洋1, age=21)] //*****************************
参考:https://blog.csdn.net/finalheart/article/details/86073477
第二章
Java中TypeReference用法说明
用途、测试
在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:
parseObject()方法同理
- getObject(key,xxx.class)
- 传入类对象的时候
- 再不破坏数据结构的情况下,传啥,返回的类型就是啥。
- getObject(key,new TypeReference< Xxx >() {})
- 传入TypeReference时,
- 传啥返回的类型都是Object,再不破坏数据结构的情况下,传入啥类型就用啥类型去接收返回值就可以。
- parseObject(str,xxx)方法同理(将JSON字符串转化成对应的对象,str:json字符串、xxx要转成的对象类型)
- xxx若为xxx.class时、或new TypeReference>() {}
- 传啥返回值的类型就是啥
测试parseObject()方法
若传入的类型有泛型就会编译不通过
想传入带有泛型的类型,就是用new TypeReference< List >() {} 即可
测试:
- 传new TypeReference< List >() {}
List<Person> personList2 = JSONObject.parseObject(str, new TypeReference<List<Person>>(){}); for (Person person2 : personList2) { System.out.println(person2); } //输出: //Person(name=郭洋2, age=22) //Person(name=郭洋1, age=21)
- 传List.class
List list1 = JSONObject.parseObject(str, List.class); for (Object o : list1) { System.out.println(o); } //输出 //{"name":"郭洋2","age":22} //{"name":"郭洋1","age":21}
疑惑:
1、JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别
parseObject(String str)的作用
- JSON.parseObject(String str)是将str转化为相应的JSONObject对象,其中str是“键值对”形式的json字符串,转化为JSONObject对象之后就可以使用其内置的方法,进行各种处理了。
JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别
- 根据源码显示:JSON是一个抽象类,JSON中有一个静态方法parseObject(String text),将text解析为一个JSONObject对象并返回;JSONObject是一个继承自JSON的类,当调用JSONObject.parseObject(result)时,会直接调用父类的parseObject(String text)。所以两者没什么区别,一个是用父类去调用父类自己的静态的parseObject(String text),一个是用子类去调用父类的静态parseObject(String text),两者调的是同一个方法。
JSONObject json=JSON.parseObject(params); // parms:字符串 把字符串转为JSONObject对象