一、背景
1.JSON在短时间内迅速风靡全球,原因有很多如WEB2.0的推动、JSON易用、高性能等等,互联网科技巨头也出了自家json,google有GSON阿里有fastjson,今天我主要讲下fastjson的编程开发案例。
二、优点
1.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
2.JSON具体“自我描述性”(方便人阅读和编写。同时也易于机器解析和生成)
3.JSON采用完全独立于语言的文本格式
4.JavaScript和JSON无缝集成的
5.(应用场景丰富)Redis和MongoDB都采用json的格式存储,阿里、腾讯开放平台接口API都是json格式,json已经无处不在,程序员必备。
三、导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
四、第一个例子(把对象转化成json串)
1.测试类
public class demo1 {
public static void main(String[] args) {
Student student = new Student(1, "张三");
Student student1 = new Student(2, "李四");
List<Student> list = Lists.newArrayList();
list.add(student);
list.add(student1);
Teacher teacher = new Teacher("诺言", list);
//实体类中的toString()
System.out.println(student);
//把对象转化成json串
System.out.println(JSONObject.toJSONString(student));
System.out.println(JSONObject.toJSONString(teacher));
}
}
2.结果
Student{id=1, name='张三'}
{"id":1,"name":"张三"}
{"list":[{"id":1,"name":"张三"},{"id":2,"name":"李四"}],"name":"诺言"}
五、第二个例子(json串转化成对象)
1.测试类
public class demo1 {
public static void main(String[] args) {
String value="{\"list\":[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}],\"name\":\"诺言\"}";
Teacher teacher = JSON.parseObject(StringUtils.trim(value), Teacher.class);
System.out.println(teacher);
}
}
2.结果
Teacher{name='诺言', list=[Student{id=1, name='张三'}, Student{id=2, name='李四'}]}
六、第三个例子(map集合转json串)
1.测试类
public class demo1 {
public static void main(String[] args) {
HashMap<String, Student> map = Maps.newHashMap();
map.put("帅哥",new Student(1,"张三"));
System.out.println(JSON.toJSONString(map));
}
}
2.结果
{"帅哥":{"id":1,"name":"张三"}}
七、第四个例子(json串集合转map)
1.测试类
public class demo1 {
public static void main(String[] args) {
String value="{\"帅哥\":{\"id\":1,\"name\":\"张三\"}}";
Map<String, Student> map = Maps.newHashMap();
map = JSON.parseObject(value, Map.class);
System.out.println(map.get("帅哥"));
}
}
2.结果
{"name":"张三","id":1}
八、第五个例子( json集合转成集合对象)
1.测试类
public class demo1 {
public static void main(String[] args) {
String value="[{\"id\":2,\"name\":\"小红\"},{\"id\":1,\"name\":\"张三\"}]";
List<Student> list = JSONArray.parseArray(value, Student.class);
System.out.println(list);
}
}
2.结果
[Student{id=2, name='小红'}, Student{id=1, name='张三'}]
九、第五个例子(高级的json注解和泛型用法)
1.Student类
public class Student {
@JSONField(name = "id")
private Integer id;
@JSONField(name = "name")
private String name;
//getter、setter方法
}
2.Teacher类
public class Teacher {
private String name;
private List<Student> list;
//getter、setter
}
3.AbstractSchool<T>抽象类
public class AbstractSchool<T> {
//抽象的学校人
//人数量
@JSONField(name = "num")
private int num;
@JSONField(name = "school_name")
private String schoolName;;
//业务数据,可以放老师、学生、食堂大妈
@JSONField(name = "human")
private List<T> human;
//getter、setter
}
4.测试类
public class demo1 {
public static void main(String[] args) {
ArrayList<Student> students = Lists.newArrayList(new Student(1, "张三"), new Student(2, "李四"));
AbstractSchool<Student> studentAbstractSchool = new AbstractSchool<>();
studentAbstractSchool.setNum(students.size());
studentAbstractSchool.setSchoolName("清华大学");
studentAbstractSchool.setHuman(students);
System.out.println(JSONObject.toJSONString(studentAbstractSchool));
}
}
5.结果
{"human":[{"id":1,"name":"张三"},{"id":2,"name":"李四"}],"num":2,"school_name":"清华大学"}
6.总结
逻辑说明:
- AbstractSchool就我抽象出来的学校的人,利用泛型来实现扩展。在实战项目中响应结果对象就可以设计成这样的AbstractResponse,特别是查询业务。
- JSONField注解,看例子也明白是什么意思。
注意
- 建议json值的类型就用字符和int等简单类型,用复杂类型序列化有风险。
- 建议用官方最新maven版本,漏洞一直在修复。
- json嵌套不要超过4层。
- 设计表的大字段建议存json格式数据扩展性极好。
十、结束
Always keep the faith!!!