转发:JSON本领的调查研商报告(三种普及的JSON格式相比较及深入分析)

转发自地址:http://www.cnblogs.com/kunpengit/p/4001680.html

{
  "total": 16,
  "rows":[
  {
    "name": "张三",
    "email": "124769545@126.com",
    "date": "2016-08-13"
  },
  {
    "name": "李四",
    "email": "1232116895@163.com",
    "date": "2015-06-23"
  },
  {
    "name": "王五",
    "email": "1647764645@139.com",
    "date": "2015-09-09"
  },
  {
    "name": "额啊",
    "email": "4433232134@126.com",
    "date": "2014-11-02"
  },
  {
    "name": "啊地方",
    "email": "eqeqew1212@sina.com",
    "date": "2014-04-01"
  },
  {
    "name": "格栅灯",
    "email": "3424143131@139.com",
    "date": "2014-12-09"
  },
  {
    "name": "黄蜂队",
    "email": "431243412@126.com",
    "date": "2015-12-03"
  },
  {
    "name": "大幅",
    "email": "244234131@163.com",
    "date": "2015-08-07"
  },
  {
    "name": "山东",
    "email": "1235132415@qq.com",
    "date": "2014-01-09"
  },
  {
    "name": "光辉",
    "email": "2545234242@139.com",
    "date": "2016-07-23"
  },
  {
    "name": "张五",
    "email": "14457876954@126.com",
    "date": "2014-08-17"
  },
  {
    "name": "李四",
    "email": "452165224@163.com",
    "date": "2011-09-01"
  },
  {
    "name": "刘三",
    "email": "wasad1223@139.com",
    "date": "2016-07-15"
  },
  {
    "name": "崔时",
    "email": "672192321@qq.com",
    "date": "2013-06-04"
  },
  {
    "name": "党东",
    "email": "w5364545@126.com",
    "date": "2012-10-08"
  },
  {
    "name": "王思",
    "email": "34234232@qq.com",
    "date": "2013-08-17"
  }]
}

1、种种JSON技巧的简单介绍和上下
1.json-lib
json-lib最开首的也是行使最广泛的json剖判工具,json-lib
倒霉的地点确实是依靠于广大第三方包,
包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,
对此复杂类型的退换,json-lib对于json转变来bean还会有缺陷,例如一个类里面汇合世另八个类的list恐怕map群集,json-lib从json到bean的调换就能够出现难点。
json-lib在效益和总体性方面都不可能满足未来网络化的急需。
2.开源的Jackson
比较json-lib框架,杰克逊所依赖的jar包较少,轻巧易用并且品质也要相对高些。
而且杰克逊社区周旋相比活跃,更新速度也正如快。
Jackson对于复杂类型的json调换bean会出现难题,一些集结Map,List的转移出现难点。
杰克逊对于复杂类型的bean转变Json,转变的json格式不是明媒正娶的Json格式
3.Google的Gson
Gson是当前效应最全的Json分析神器,Gson当初是为因应谷歌(Google)公司之中须求而由谷歌(Google)自行研发而来,
但自从在二〇〇八年七月了然透露第2版后已被多数商家或用户使用。
Gson的采纳关键为toJson与fromJson三个转移函数,无依赖,没有要求不一致额外的jar,能够平昔跑在JDK上。
而在行使这种对象转变此前需先创制好对象的档案的次序以及其成员技能成功的将JSON字符串成功调换来相对应的对象。
类里面只要有get和set方法,Gson完全能够将复杂类型的json到bean或bean到json的改造,是JSON解析的神器。
Gson在效益方面无可批评,可是质量方面比法斯特Json有所差异。
4.Alibaba的法斯特Json
法斯特json是三个Java语言编写的高质量的JSON管理器,由阿里Baba(Alibaba)集团开销。
无凭借,无需差异额外的jar,能够一直跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现有的标题,或许会油但是生引用的项目,导致Json转变出错,须要制定引用。
法斯特Json选取独创的算法,将parse的速度升高到极致,超过持有json库。


综上四种Json本领的相比较,在品种选型的时候能够接纳谷歌(Google)的Gson和阿里Baba(Alibaba)的FastJson三种互相使用,
倘使只是功用供给,未有质量要求,可以运用google的Gson,
万1有总体性方面包车型客车渴求能够采用Gson将bean转变json确保数量的不易,使用法斯特Json将Json调换Bean
2、谷歌的Gson包的接纳简要介绍。
Gson类:分析json的最基础的工具类

JsonParser类:分析器来深入分析JSON到JsonElements的分析树
JsonElement类:1个类代表的JSON成分
JsonObject类:JSON对象类型
JsonArray类:JsonObject数组
TypeToken类:用于创制type,举个例子泛型List<?>

(1)maven依赖

com.google.code.gson
gson
2.2.4

(二)基础调换类

 1 public class Book {
 2     private String id;
 3     private String name;
 4 
 5     public Book() {
 6         super();
 7     }
 8 
 9     public String getId() {
10         return id;
11     }
12 
13     public void setId(String id) {
14         this.id = id;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 }
25 
26 public class Student {
27     private String name;
28     private int age;
29     private String sex;
30     private String describe;
31     private Set books;
32 
33     public Student() {
34         super();
35     }
36 
37     public String getName() {
38         return name;
39     }
40 
41     public void setName(String name) {
42         this.name = name;
43     }
44 
45     public int getAge() {
46         return age;
47     }
48 
49     public void setAge(int age) {
50         this.age = age;
51     }
52 
53     public String getSex() {
54         return sex;
55     }
56 
57     public void setSex(String sex) {
58         this.sex = sex;
59     }
60 
61     public Set getBooks() {
62         return books;
63     }
64 
65     public void setBooks(Set books) {
66         this.books = books;
67     }
68 
69     public String getDescribe() {
70         return describe;
71     }
72 
73     public void setDescribe(String describe) {
74         this.describe = describe;
75     }
76 }

(3)bean转换json

1 Gson gson = new Gson();
2 String json = gson.toJson(obj);
3 //obj是对象

(4)json转换bean

1 Gson gson = new Gson();
2 String json = "{\"id\":\"2\",\"name\":\"Json技术\"}";
3 Book book = gson.fromJson(json, Book.class);

(⑤)json调换复杂的bean,例如List,Set

将json调换到复杂类型的bean,供给选用TypeToken

1 Gson gson = new Gson();
2 String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
3 //将json转换成List
4 List list = gson.fromJson(json,new TypeToken<LIST>() {}.getType());
5 //将json转换成Set
6 Set set = gson.fromJson(json,new TypeToken<SET>() {}.getType());

(陆)通过json对象直接操作json以及部分json的工具

a)格式化Json

1 String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
2 Gson gson = new GsonBuilder().setPrettyPrinting().create();
3 JsonParser jp = new JsonParser();
4 JsonElement je = jp.parse(json);
5 json = gson.toJson(je);

b)判定字符串是或不是是json,通过捕捉的10分来推断是还是不是是json

 1 String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
 2     boolean jsonFlag;try
 3     {
 4         new JsonParser().parse(str).getAsJsonObject();
 5         jsonFlag = true;
 6     }catch(
 7     Exception e)
 8     {
 9         jsonFlag = false;
10     }

c)从json串中拿走属性

 1 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
 2     String propertyName = 'id';
 3     String propertyValue = "";try
 4     {
 5         JsonParser jsonParser = new JsonParser();
 6         JsonElement element = jsonParser.parse(json);
 7         JsonObject jsonObj = element.getAsJsonObject();
 8         propertyValue = jsonObj.get(propertyName).toString();
 9     }catch(
10     Exception e)
11     {
12         propertyValue = null;
13     }

d)除去json中的有个别属性

1 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 String propertyName = 'id';
3 JsonParser jsonParser = new JsonParser();
4 JsonElement element = jsonParser.parse(json);
5 JsonObject jsonObj = element.getAsJsonObject();
6 jsonObj.remove(propertyName);
7 json = jsonObj.toString();

e)向json中增添属性

1 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 String propertyName = 'desc';
3 Object propertyValue = "json各种技术的调研";
4 JsonParser jsonParser = new JsonParser();
5 JsonElement element = jsonParser.parse(json);
6 JsonObject jsonObj = element.getAsJsonObject();
7 jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
8 json = jsonObj.toString();

f)修改json中的属性

1 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 String propertyName = 'name';
3 Object propertyValue = "json各种技术的调研";
4 JsonParser jsonParser = new JsonParser();
5 JsonElement element = jsonParser.parse(json);
6 JsonObject jsonObj = element.getAsJsonObject();
7 jsonObj.remove(propertyName);
8 jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
9 json = jsonObj.toString();

g)剖断json中是否有品质

1 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 String propertyName = 'name';
3 boolean isContains = false ;
4 JsonParser jsonParser = new JsonParser();
5 JsonElement element = jsonParser.parse(json);
6 JsonObject jsonObj = element.getAsJsonObject();
7 isContains = jsonObj.has(propertyName);

h)json中国和东瀛期格式的拍卖

1 GsonBuilder builder = new GsonBuilder();
2 builder.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
3 Gson gson = builder.create();

下一场使用gson对象开始展览json的拍卖,若是出现日期Date类的目的,就能够依据设置的格式举行管理

i)json中对于Html的转义

1 Gson gson = new Gson();
2 //这种对象默认对Html进行转义,如果不想转义使用下面的方法
3 GsonBuilder builder = new GsonBuilder();
4 builder.disableHtmlEscaping();
5 Gson gson = builder.create();

叁、阿里Baba(Alibaba)的FastJson包的使用简单介绍。

(1)maven依赖

com.alibaba
fastjson
1.1.22

(二)基础调换类
同上
(3)bean转换json
将对象调换到格式化的json
JSON.toJSONString(obj,true);
将对象调换来非格式化的json
JSON.toJSONString(obj,false);
obj设计指标
对此复杂类型的转移,对于再次的引用在转成json串后在json串中出现引用的字符,举个例子$ref”:”$[0].books[1]

1 Student stu = new Student();
2     Set books = new HashSet();
3     Book book = new Book();books.add(book);stu.setBooks(books);
4     List list = new ArrayList();
5     for(int i = 0;i<5;i++)
6         list.add(stu);
7     String json = JSON.toJSONString(list, true);

(4)json转换bean

1 String json = "{\"id\":\"2\",\"name\":\"Json技术\"}";
2 Book book = JSON.parseObject(json, Book.class);

(伍)json转变复杂的bean,比如List,Map

1 String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
2 //将json转换成List
3 List list = JSON.parseObject(json,new TypeReference<ARRAYLIST>(){});
4 //将json转换成Set
5 Set set = JSON.parseObject(json,new TypeReference<HASHSET>(){});

(陆)通过json对象间接操作json

a)从json串中得到属性

1 String propertyName = 'id';
2 String propertyValue = "";
3 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
4 JSONObject obj = JSON.parseObject(json);
5 propertyValue = obj.get(propertyName));

b)除去json中的某些属性

1 String propertyName = 'id';
2 String propertyValue = "";
3 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
4 JSONObject obj = JSON.parseObject(json);
5 Set set = obj.keySet();
6 propertyValue = set.remove(propertyName);
7 json = obj.toString();

c)向json中增添属性

1 String propertyName = 'desc';
2 Object propertyValue = "json的玩意儿";
3 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
4 JSONObject obj = JSON.parseObject(json);
5 obj.put(propertyName, JSON.toJSONString(propertyValue));
6 json = obj.toString();

d)修改json中的属性

1 String propertyName = 'name';
2 Object propertyValue = "json的玩意儿";
3 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
4 JSONObject obj = JSON.parseObject(json);
5 Set set = obj.keySet();
6 if(set.contains(propertyName))
7   obj.put(propertyName, JSON.toJSONString(propertyValue));
8 json = obj.toString();

e)判别json中是还是不是有总体性

1 String propertyName = 'name';
2 boolean isContain = false;
3 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
4 JSONObject obj = JSON.parseObject(json);
5 Set set = obj.keySet();
6 isContain = set.contains(propertyName);

f)json中国和东瀛期格式的管理

1 Object obj = new Date();
2 String json = JSON.toJSONStringWithDateFormat(obj, "yyyy-MM-dd HH:mm:ss.SSS");

应用JSON.toJSONStringWithDateFormat,该办法能够应用安装的日期格式对日期举行更动

3、json-lib包的运用简单介绍。
(1)maven依赖

net.sf.json-lib
json-lib
jdk15
2.2.2

commons-beanutils
commons-beanutils
1.8.3

commons-collections
commons-collections
3.2

commons-lang
commons-lang
2.6

commons-logging 
commons-logging 
1.1.1 

net.sf.ezmorph
ezmorph
1.0.6

(二)基础调换类
同上
(3)bean转换json
a)将类调换到Json,obj是日常的靶子,不是List,Map的靶子

1 String json = JSONObject.fromObject(obj).toString();

b)将List,Map转换成Json

1 String json = JSONArray.fromObject(list).toString();
2 String json = JSONArray.fromObject(map).toString();

(4)json转换bean

1 String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 JSONObject jsonObj = JSONObject.fromObject(json);
3 Book book = (Book)JSONObject.toBean(jsonObj,Book.class);

(5)json转换List,对于复杂类型的转换会出现难点

 1 String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"Java技术\"}]";
 2 JSONArray jsonArray = JSONArray.fromObject(json);
 3 JSONObject jsonObject;
 4 T bean;
 5 int size = jsonArray.size();
 6 List list = new ArrayList(size);
 7 for(int i = 0;i<size;i++){
 8     jsonObject = jsonArray.getJSONObject(i);
 9     bean = (T) JSONObject.toBean(jsonObject, beanClass);
10     list.add(bean);
11 }

(6)json转换Map

 1 String jsonString = "{\"id\":\"1\",\"name\":\"Json技术\"}";
 2 JSONObject jsonObject = JSONObject.fromObject(jsonString);
 3 Iterator keyIter = jsonObject.keys();
 4 String key;
 5 Object value;
 6 Map valueMap = new HashMap();
 7 while(keyIter.hasNext()){
 8     key = (String) keyIter.next();
 9     value = jsonObject.get(key).toString();
10     valueMap.put(key, value);
11 }

(七)json对于日期的操作比较复杂,必要运用JsonConfig,比Gson和法斯特Json要麻烦多了

始建转换的接口达成类,转变到钦定格式的日子

 1 class DateJsonValueProcessor implements JsonValueProcessor {
 2     public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
 3     private DateFormat dateFormat;
 4 
 5     public DateJsonValueProcessor(String datePattern) {
 6         try {
 7             dateFormat = new SimpleDateFormat(datePattern);
 8         } catch (Exception ex) {
 9             dateFormat = new SimpleDateFormat(DEFAULT_DATE_PATTERN);
10         }
11     }
12 
13     public Object processArrayValue(Object value, JsonConfig jsonConfig) {
14         return process(value);
15     }
16 
17     public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) {
18         return process(value);
19     }
20 
21     private Object process(Object value) {
22         return dateFormat.format[1];
23         Map<STRING, DATE> birthDays = new HashMap<STRING, DATE>();
24         birthDays.put("WolfKing", new Date());
25         JSONObject jsonObject = JSONObject.fromObject(birthDays, jsonConfig);
26         String json = jsonObject.toString();
27         System.out.println(json);
28     }
29 }

(八)JsonObject 对于json的操作和拍卖

a)从json串中收获属性

1 String jsonString = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 Object key = "name";
3 Object value = null;
4 JSONObject jsonObject = JSONObject.fromObject(jsonString);
5 value = jsonObject.get(key);
6 jsonString = jsonObject.toString();

b)除去json中的有个别属性

1 String jsonString = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 Object key = "name";
3 Object value = null;
4 JSONObject jsonObject = JSONObject.fromObject(jsonString);
5 value = jsonObject.remove(key);
6 jsonString = jsonObject.toString();

c)向json中加上和修改属性,有则修改,无则增加

1 String jsonString = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 Object key = "desc";
3 Object value = "json的好东西";
4 JSONObject jsonObject = JSONObject.fromObject(jsonString);
5 jsonObject.put(key,value);
6 jsonString = jsonObject.toString();

d)剖断json中是不是有总体性

1 String jsonString = "{\"id\":\"1\",\"name\":\"Json技术\"}";
2 boolean containFlag = false;
3 Object key = "desc";
4 JSONObject jsonObject = JSONObject.fromObject(jsonString);
5 containFlag = jsonObject.containsKey(key);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图