一 FastJSON简短介绍
JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下
FastJson,FastJson是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架。
FastJson的特点:
1.FastJson数度快,无论序列化和反序列化,都是当之无愧的fast
2.功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
3.零依赖(没有依赖其它任何类库)
首先要下载fastjson的jar包。github地址: https://github.com/alibaba/fastjson
这里只牵扯到后端方面,用Junit4框架进行测试
二 FastJSON三个类的简单介绍
FastJSON包中有三个常用的对象,JSON,JSONObject,JSONArray三个对象。
二.一 JSON类
public abstract class JSON implements JSONStreamAware, JSONAware{ }
JSON类实现了JSONStreamAware和JSONAware接口。
JSONAware接口:
package com.alibaba.fastjson; public abstract interface JSONAware { //转换成JSON类型的字符串 public abstract String toJSONString(); }
JSONStreamAware接口:
public abstract interface JSONStreamAware //JSON+流+Aware 能力 { // 向里面写Appendable, 追加。 转换成JSON字符串 public abstract void writeJSONString(Appendable paramAppendable) throws IOException; }
Appendable接口:
public interface Appendable { //添加字符串 Appendable append(CharSequence csq) throws IOException; //添加的字符串,可以截取 start,end Appendable append(CharSequence csq, int start, int end) throws IOException; //添加单个字符 Appendable append(char c) throws IOException; }
二.二 JSONObject 类
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler{ }
JSONObject类继承了JSON类,实现了Map接口,Cloneable(克隆接口),序列化(Serializable),InvocationHandler(调用处理器)
InvocationHandler.java
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
默认值为16。
所以JSONObject主要存储的方式是以Map<Key,Value>的形式进行相应的存储。存储的是单值形式。
构造方法:
public JSONObject(Map<String, Object> map) { this.map = map; }
二.三 JSONArray类
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable{}
JSONArray类也继承了JSON类, 实现了List<Object>接口,Cloneable克隆接口,Serializable 序列化接口,RandomAccess接口。
public interface RandomAccess { }
实现了List接口,是以数组的形式进行相应的存储。
构造方法:
public JSONArray(List<Object> list) { this.list = list; }
JSONObject和JSONArray均实现了JSON类,故一般都是用子类,即单值用JSONObject,集合用JSONArray。
三 JSONObject类的具体使用
三.一 转换成普通字符串格式
转换的格式为: var obj={"name":"两个蝴蝶飞","age":24,"sex":"男"};
代码为:
/** * 一个普通的字符串格式. * var obj={"name":"两个蝴蝶飞","age":24,"sex":"男"}; * 用JSONObject进行添加. */ @Test public void testString1(){ //空构造 JSONObject json=new JSONObject(); //内部使用的是map结构,put放置值 json.put("id",1); json.put("name","两个蝴蝶飞"); json.put("age",24); json.put("sex","男"); //转换成json字符串. toJSONString() String result=json.toJSONString(); System.out.println(result); }
是字符串格式。
三.二 将JSON字符串进行解析取值
@Test /* * 解析JSON字符串 * {"name":"两个蝴蝶飞","age":24,"sex":"男"}; */ public void testToString1(){ String source="{'name':'两个蝴蝶飞','age':24,'sex':'男'}"; //利用静态方法parseObject(source),将要解析的资源放进去 JSONObject json=JSON.parseObject(source); //取得数据时 可以取得具体的类型 System.out.println(json.getIntValue("age")); System.out.println(json.getString("sex")); System.out.println(json.getString("name")); }
三.三 利用Map显式放置值
@Test /** * 前面带一个前缀. 用添加Map * {"person":{"name":"两个蝴蝶飞","age":24,"sex":"男"}} */ public void testString2(){ Map<String,Object> map=new HashMap<String,Object>(); map.put("name","岳建立"); map.put("age",24); map.put("sex","男"); JSONObject json=new JSONObject(); json.put("person",map); String result=json.toJSONString(); System.out.println(result); //如果不要前缀,可以直接 {"name":"两个蝴蝶飞","age":24,"sex":"男"} //System.out.println(JSON.toJSONString(map)); }
三.四 取出Map中的值
@Test public void testToString2(){ String source="{\"person\":{\"sex\":\"男\",\"name\":\"岳建立\",\"age\":24}}"; JSONObject json=JSON.parseObject(source); System.out.println(json.getString("person")); // {"name":"两个蝴蝶飞","age":24,"sex":"男"} //继续取出 JSONObject json2=JSON.parseObject(json.getString("person")); System.out.println(json2.getString("name")); System.out.println(json2.getString("sex")); System.out.println(json2.getIntValue("age")); }
四 JSONArray的使用
如果属性过多的话,那么就需要用一个User类进行相应的封装了。即开始引入对象了。
引入相应的User的类
package com.fastjson.pojo; /** *author 作者 两个蝴蝶飞 *version 创建时间 2018年9月16日下午3:42:37 */ public class User { private int id; private String name; private int age; private String sex; private String content; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
四.一 JSONArray 配置单个JavaBean类
1. 前缀没有用key值:
@Test /** * 将一个单对象转换成JSON格式 * {"age":24,"content":"一个小小的程序员","id":1,"name":"两个蝴蝶飞","sex":"男"} */ public void testUser1(){ User user=new User(); user.setId(1); user.setName("两个蝴蝶飞"); user.setSex("男"); user.setAge(24); user.setContent("一个小小的程序员"); //直接用JSON.toJSONString(); toJSONString(user) String result=JSON.toJSONString(user); System.out.println(result); }
2. 前缀有key值
@Test public void testUser1(){ User user=new User(); user.setId(1); user.setName("两个蝴蝶飞"); user.setSex("男"); user.setAge(24); user.setContent("一个小小的程序员"); //用JSONObject JSONObject json=new JSONObject(); json.put("user",user); String result=json.toJSONString(); System.out.println(result); }
3. 取出没有key值的Java Bean
@Test public void testToUser4(){ String source="{\"age\":24,\"content\":\"一个小小的程序员\",\"id\":1,\"name\":\"两个蝴蝶飞\",\"sex\":\"男\"}"; //直接转换成对象 User user1=JSON.parseObject(source,User.class); System.out.println(user1); }
4. 取出有key值的的Java Bean
@Test public void testToUser1(){ String source="{\"user\":{\"age\":24,\"content\":\"一个小小的程序员\",\"id\":1,\"name\":\"两个蝴蝶飞\",\"sex\":\"男\"}}"; //直接转换成对象 //先取出后面的值 String result=JSON.parseObject(source).getString("user"); //继承转换 User user1=JSON.parseObject(result,User.class); System.out.println(user1); }
四.二 JSONArray 配置List 集合
@Test //将一个对象数组集合添加到JSON中,用JSONArray /* {"persons":[{"age":0,"content":"小小的程序员而已0","id":0,"name":"两个蝴蝶飞0","sex":"男"}, {"age":0,"content":"小小的程序员而已1","id":1,"name":"两个蝴蝶飞1","sex":"女"}, {"age":0,"content":"小小的程序员而已2","id":2,"name":"两个蝴蝶飞2","sex":"男"}]} */ public void testUser2(){ List<User> users = new ArrayList<User>(); for (int i = 0; i < 3; i++) { User u = new User(); u.setId((i)); u.setName("两个蝴蝶飞"+i); u.setContent("小小的程序员而已"+i); u.setSex(i % 2 == 0 ? "男" : "女"); users.add(u); } //String result=JSON.toJSONString(users); JSONObject json=new JSONObject(); json.put("persons",users); String result=json.toJSONString(); System.out.println(result); }
解析List集合
@Test public void testToUser2(){ String resource="{\"list\":[{\"id\":0,\"name\":\"两个蝴蝶飞0\",\"sex\":\"男\"} {\"id\":1,\"name\":\"两个蝴蝶飞1\",\"sex\":\"女\"},{\"id\":2,\"name\":\"两个蝴蝶飞2\",\"sex\":\"男\"}]}"; String text=JSON.parseObject(resource).getString("list"); //现在,这已经是一个数组了.如何将数组进行解析呢? 用JSONArray JSONArray arrays=JSON.parseArray(text); List<User> allList=new ArrayList<User>(); for(int i=0;i<arrays.size();i++){ //用toJavaObject toJavaObject User u=JSON.toJavaObject(arrays.getJSONObject(i),User.class); allList.add(u); } for (User user : allList) { System.out.println(user.getId()+","+user.getName()); } }
这是常用的几种解析方式。谢谢
解析成功,谢谢!!!