首页 > 代码库 > 使用Gson解析Json

使用Gson解析Json

1.Json介绍

      JSON的全称是"JavaScript Object Notation",即JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式。两者的区别:因为XML虽然可以作为跨平台的数据交换格式,但是在JS中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们倾向于选择JSON来交换数据。

2.Json的两种结构

    JSON有两种表示结构,对象和数组

    对象结构:以{}为闭合,中间部分由","来分割的"key/value"对构成,关键字和值之间以":"分隔。其中关键字是字符串,而值可以使字符串,数值,true,false,null,对象或数组。语法结构如下:
  {key1:value1,key2:value2,key3:value3,key4:value4......}
  举例:{"UserID":11, "Name":"Truly", "Email":"zhuleipro@hotmail.com"};
  数组结构:以[]闭合,中间由","来分割的值列表组成,语法结构如下:
  [
  {
  key1:value1,
  key2:value2
  },
  {
  key3:value3,
  key4:value4
  }]

3.区分JSON字符串和JSON对象

 

     JSON字符串:使用""(双引号)或‘‘(单引号)包括的符合JSON格式的字符串。例如:
var str = "{StudentID:‘101‘,Name:‘mike‘,Age:15}";
     JSON对象:指符合JSON格式的js对象,例如:

var jsonObj = {StudentID:‘101‘,Name:‘mike‘,Age:15};

     下面我们就Java使用Gson解析json数据举例说明,首先我们要导入Gson.jar包。网上可以下载,我这里用的是Gson-2.3.jar。

 4.实例

实现:

使用Gson的API实现Json和javaBean的相互转换

使用Gson的API实现Map和Json字符串相互转换
List<Object>或List<JavaBean>与Json字符串相互转换

目录结构:

技术分享

这里,我们主要对json字符串和各种对象之间转换进行了举例,实现方法在JsonUtil.java中,同时,针对config.properties配置文件中没有的字段信息,我们会进行更新。

代码清单【1】People.java

 1 package com.lxf.json;
 2 /**
 3  * javaBean
 4  * @author Administrator
 5  * 
 6  * 20170107
 7  */
 8 public class People
 9 {
10     //编号
11     private String id;
12     //姓名
13     private String name;
14     //邮箱地址
15     private String email;
16     //是否是vip  true:是  false:不是
17     private boolean vip;
18     
19     public People()
20     {
21         
22     }
23     public People(String id, String name, String email, boolean vip) {
24         super();
25         this.id = id;
26         this.name = name;
27         this.email = email;
28         this.vip = vip;
29     }
30     
31     public String getId()
32     {
33         return id;
34     }
35     public void setId(String id)
36     {
37         this.id = id;
38     }
39     public String getName() 
40     {
41         return name;
42     }
43     public void setName(String name) 
44     {
45         this.name = name;
46     }
47     public String getEmail() 
48     {
49         return email;
50     }
51     public void setEmail(String email) 
52     {
53         this.email = email;
54     }
55     public boolean isVip() 
56     {
57         return vip;
58     }
59     public void setVip(boolean vip)
60     {
61         this.vip = vip;
62     }
63     
64     @Override
65     public String toString() {
66         StringBuilder builder = new StringBuilder();
67         builder.append("People [id=");
68         builder.append(id);
69         builder.append(", name=");
70         builder.append(name);
71         builder.append(", email=");
72         builder.append(email);
73         builder.append(", vip=");
74         builder.append(vip);
75         builder.append("]");
76         return builder.toString();
77     }    
78 
79 }

 

代码清单【2】JsonUtil.java

  1 package com.lxf.json;
  2 
  3 import java.io.FileInputStream;
  4 import java.io.FileOutputStream;
  5 import java.io.OutputStream;
  6 import java.lang.reflect.Type;
  7 import java.util.ArrayList;
  8 import java.util.HashMap;
  9 import java.util.Iterator;
 10 import java.util.LinkedHashMap;
 11 import java.util.List;
 12 import java.util.Map;
 13 import java.util.Properties;
 14 import java.util.Set;
 15 
 16 import com.google.gson.Gson;
 17 import com.google.gson.JsonElement;
 18 import com.google.gson.JsonObject;
 19 import com.google.gson.JsonPrimitive;
 20 import com.google.gson.internal.LinkedHashTreeMap;
 21 import com.google.gson.internal.LinkedTreeMap;
 22 import com.google.gson.reflect.TypeToken;
 23 
 24 /**
 25  * Json工具类
 26  * @author Administrator
 27  *
 28  */
 29 public class JsonUtil 
 30 {
 31     private static String propertiesPath = "src/config.properties";
 32     
 33     private static Properties prop = new Properties(); 
 34     
 35     static 
 36     {
 37         try 
 38         {
 39             prop.load(new FileInputStream(propertiesPath));
 40         }
 41         catch (Exception e) 
 42         {
 43             e.printStackTrace();
 44         }
 45     }
 46     
 47     /**
 48      * 0.0读取配置文件的相应键的值
 49      * @param str  主键
 50      * @return
 51      */
 52     public static String readConfig(String str)
 53     {
 54     
 55         if(prop.containsKey(str))
 56         {
 57             return prop.getProperty(str);
 58         }
 59         else
 60         {
 61             throw new RuntimeException("the properties file don‘t contains "+ str + " key");
 62         }
 63         
 64     }
 65     
 66     /**
 67      * 0.1 更新(或插入)一对properties信息(主键及其键值)  
 68      * 如果该主键已经存在,更新该主键的值;  
 69      * 如果该主键不存在,则插件一对键值。 
 70      * @param str  键名
 71      * @param value  键值
 72      */
 73     public static void updateConfig(String str,String value) 
 74     {
 75         try
 76         {
 77             OutputStream fos = new FileOutputStream(propertiesPath);
 78             //如果该主键已经存在,更新该主键的值;  
 79             prop.setProperty(str, value);
 80             if(prop.containsKey(str))
 81             {
 82                 prop.store(fos, "Update :" + str + "=" + value);
 83             }
 84             else
 85             {
 86                 prop.store(fos, "Insert : " + str + "=" + value);
 87             }
 88         } 
 89         catch (Exception e) 
 90         {
 91             System.out.println();
 92         }
 93         
 94     }
 95     /*
 96      * 1.1 json字符串--->JavaBean
 97      */
 98     public static void jsonToJavaBean()
 99     {
100         
101         String jsonStr = readConfig("huawei");
102         Gson gson = new Gson();
103         People people = gson.fromJson(jsonStr, People.class);
104         System.out.println(people.toString());
105     }
106     
107     /*
108      * 1.2 JavaBean--->json字符串
109      */
110     public static void javaBeanToJson() 
111     {
112         //创建javaBean
113         People p = new People();
114         p.setId("99");
115         p.setName("apple");
116         p.setEmail("110@163.com");
117         p.setVip(false);
118         //把javaBean转换为json字符串
119         Gson gson = new Gson();
120         String json = gson.toJson(p);
121         System.out.println(json);
122         
123         //查看配置文件中是否有该配置项,如果没有,添加到配置文件中,如果有,更新value值
124         String configKey = p.getName();
125         updateConfig(configKey,json);
126     }
127     
128     /*
129      * 1.3 json字符串---->Json对象 
130      */
131     public static void jsonToJsonObj()
132     {
133         String jsonStr = readConfig("huawei");
134         Gson gson = new Gson();
135         //json字符串转换为JsonObject
136         JsonObject jsonObject = (JsonObject) gson.fromJson(jsonStr, JsonElement.class);
137         System.out.println(jsonObject);
138         System.out.println(jsonObject.toString().equals(jsonStr));
139         //得到JsonObject的某个字段的值
140         JsonPrimitive namePrimitive = (JsonPrimitive) jsonObject.get("name");
141         //JsonPrimitive namePrimitive =  jsonObject.getAsJsonPrimitive("name");
142         System.out.println(namePrimitive);
143         String name = namePrimitive.getAsString();
144         System.out.println(name);
145     }
146     /**
147      * 总结:
148      *     --在json字符串转成JavaBean时,fromJson传入的第二个参数是Entity.class;
149      *     --在json字符串转成JsonObject时,fromJson传入的第二个参数是JsonElement.class,不能传入JsonObject.class,
150      *  否则返回的JsonObject是空的对象。
151      *  --如果想得到某个JsonObject对象的某个属性值,可以使用.get(String str).getAsString().
152      * 
153      */
154 
155 
156     /**
157      * 2.1Map--->json转换
158      */
159     public static void mapToJson()
160     {
161         Gson gson = new Gson();
162         Map<String, Object> map = new HashMap<String, Object>();
163         map.put("id", 1);
164         map.put("name", "xiaomi");
165         map.put("vip", true);
166         String json = gson.toJson(map);
167         System.out.println(json);
168         
169         //查看配置文件中是否有该配置项,如果没有,添加到配置文件中,如果有,更新value值
170         String configKey = (String) map.get("name");
171         updateConfig(configKey,json);
172     }
173     
174     /**
175      * 2.2 json---->Map转换
176      */
177     
178     public static void jsonToMap()
179     {
180         Gson gson = new Gson();
181         String json = prop.getProperty("xiaomi");
182         Map<String, Object> map = gson.fromJson(json, Map.class);
183         //这里原来map中id键对应的值类型是int,但是转成json字符串再转回来后,int类型变为Double类型了,这值得重视。
184         //如果需要int型,还需要利用double.intValue()方法转为int型。
185         System.out.println(map);
186         System.out.println(map.get("name"));
187         System.out.println(map.get("name").getClass());
188         System.out.println(map.get("name").getClass().getName());
189     }
190     
191     
192     /*
193      * 3.List与Json相互转换
194      */
195     /**
196      * 3.1 List<Object>与json字符串互换
197      */
198     public static void listObjectToJson()
199     {
200         List<Object> list = new ArrayList<Object>();
201         for(int i = 0; i < 2; i++ )
202         {
203             list.add(i);
204             list.add("element" + i);
205         }
206         System.out.println(list);
207         Gson gson = new Gson();
208         String json = gson.toJson(list);
209         System.out.println(json);
210         
211         list = gson.fromJson(json, List.class);
212         System.out.println(list);
213         for(int i = 0 ; i < list.size(); i++)
214         {
215             Object o = list.get(i);
216             System.out.println(o);
217             System.out.println(o.getClass().getName());
218         }
219     }
220     
221     /**
222      * List<Bean> 转化为json字符串
223      * 
224      * 1.不管是转换List<Object>,还是List<JavaBean>,当把字符串反序列化为list时,gson.fromJson(String json, Class<T> classOfT)
225      * 的第2个参数必须传入List.class.
226      * 2.转换List<JavaBean>,有2中方法:
227      * (1).gson.fromJson(String json, Class<T> classOfT)的第二个参数传入List.class.此时返回的额list中的元素不是JavaBean,而是Map
228      * 如果想得到一个个javaBean,还需要从map总去除键值对,然后利用构造器封装成javaBean.
229      * (2).gson.fromJson(String json, Class<T> classOfT)的第二个参数传入Type对象(Type type = new TypeToken<List<People>>(){}.getType();),
230      * 此时返回的list对象的元素就是一个个的javaBean对象。
231      */
232     public static void listBeanTojson()
233     {
234         List<People> personList = new ArrayList<People>();
235         People p1 = new People("1001", "三星", "1001@163.com", false);
236         People p2 = new People("1002", "诺基亚", "1002@163.com", false);
237         People p3 = new People("1003", "中兴", "1003@163.com", true);
238         personList.add(p1);
239         personList.add(p2);
240         personList.add(p3);
241         
242         //利用List.class与json字符串转换
243         Gson gson = new Gson();
244         String json = gson.toJson(personList) ;
245         System.out.println(json);
246         
247         //写入到配置文件中
248         String configKey = "info";
249         updateConfig(configKey,json);
250     }
251     
252     /**
253      * 使用List.class将json转换为List<JavaBean>
254      */
255     public static void jsonToListJavaBean()
256     {
257         System.out.println("*********");
258         Gson gson = new Gson();
259         String json = prop.getProperty("info");
260         List<LinkedTreeMap<String, Object>> list = gson.fromJson(json,List.class);
261         System.out.println(list);
262         for(LinkedTreeMap<String, Object> map : list)
263         {
264             System.out.println(map.getClass().getName());
265             System.out.println(map.toString());
266             Set<Map.Entry<String, Object>> set = map.entrySet();
267             for(Iterator<Map.Entry<String, Object>> it = set.iterator();it.hasNext();)
268             {
269                 Map.Entry<String, Object> entry = it.next();
270                 System.out.println(entry.getKey() + "--->" + entry.getValue());
271             }
272         }
273         
274     }
275     
276     /**
277      * 使用Type将json字符串转化为List<JavaBean>
278      */
279     public static void jsonToListJavaByType()
280     {    
281         Gson gson = new Gson();
282         String json = prop.getProperty("info");
283         List<People> personList = new ArrayList<People>();
284         People p1 = new People("1001", "三星", "1001@163.com", false);
285         People p2 = new People("1002", "诺基亚", "1002@163.com", false);
286         People p3 = new People("1003", "中兴", "1003@163.com", true);
287         personList.add(p1);
288         personList.add(p2);
289         personList.add(p3);
290         
291         //利用TypeToken,List<JavaBean>与Json互换
292         Type type = new TypeToken<List<People>>(){}.getType();
293         System.out.println("type :" + type);
294         String json2 = gson.toJson(personList, type);
295                 
296         System.out.println(json2.equals(json));
297         List<People> userList = gson.fromJson(json2, type);
298         
299         System.out.println(userList);
300         for(int i = 0; i < userList.size(); i++)
301         {
302             System.out.println(userList.get(i).getEmail());
303         }
304     }
305     
306 
307 }

 

代码清单【3】JsonMain.java

 1 package com.lxf.json;
 2 
 3 import org.junit.Test;
 4 
 5 import com.google.gson.Gson;
 6 
 7 public class JsonMain 
 8 {
 9     /**
10      * 1.1 json字符串--->JavaBean测试
11      */
12     @Test
13     public void testJsonToJavaBean()
14     {
15         JsonUtil.jsonToJavaBean(); 
16     }
17     
18     /**
19      * 1.2 JavaBean--->json字符串测试
20      */
21     @Test
22     public void testJavaBeanToJson() 
23     {
24         JsonUtil.javaBeanToJson();
25         
26     }
27     /**
28      * 1.3 json字符串---->JsonObject
29      */
30     @Test
31     public void testJsonToJsonObject()
32     {
33         JsonUtil.jsonToJsonObj();
34     }
35     
36     /**
37      * 2.1Map--->Json测试
38      */
39     @Test
40     public void testMapToJson()
41     {
42         JsonUtil.mapToJson();
43     }
44     
45     /**
46      *  json---->Map转换
47      */
48     @Test
49     public void testJsonToMap()
50     {
51         JsonUtil.jsonToMap();
52     }
53     
54     /**
55      * list<Object> <----> json测试
56      */
57     @Test
58     public void testListObjectToJson()
59     {
60         JsonUtil.listObjectToJson();
61     }
62     
63     /**
64      * List<Bean> 转化为json字符串 测试
65      */
66     @Test
67     public void testlistBeanTojson()
68     {
69         JsonUtil.listBeanTojson();
70     }
71 
72     /**
73      * 使用List.class将json转换为List<JavaBean> 测试
74      */
75     @Test
76     public void testJsonToListJavaBean()
77     {
78         JsonUtil.jsonToListJavaBean();
79     }
80     /**
81      * 使用Type将json字符串转化为List<JavaBean>
82      */
83     @Test
84     public void testJsonToListJavaByType()
85     {
86         JsonUtil.jsonToListJavaByType();
87     }
88 }

 

运行结果:

技术分享

技术分享

 

config.properties文件:

 

1 #Update \uFF1Ainfo=[{"id":"1001","name":"\u4E09\u661F","email":"1001@163.com","vip":false},{"id":"1002","name":"\u8BFA\u57FA\u4E9A","email":"1002@163.com","vip":false},{"id":"1003","name":"\u4E2D\u5174","email":"1003@163.com","vip":true}]
2 #Mon Jan 09 23:54:36 CST 2017
3 apple={"id"\:"99","name"\:"apple","email"\:"110@163.com","vip"\:false}
4 huawei={"id"\:101,"name"\:"huawei","email"\:"2582376681@qq.com","vip"\:true}
5 info=[{"id"\:"1001","name"\:"\u4E09\u661F","email"\:"1001@163.com","vip"\:false},{"id"\:"1002","name"\:"\u8BFA\u57FA\u4E9A","email"\:"1002@163.com","vip"\:false},{"id"\:"1003","name"\:"\u4E2D\u5174","email"\:"1003@163.com","vip"\:true}]
6 xiaomi={"id"\:1,"vip"\:true,"name"\:"xiaomi"}

 

 5.拓展补充

 

使用Gson解析Json