使用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":"[email protected]"};
  数组结构:以[]闭合,中间由","来分割的值列表组成,语法结构如下:
  [
  {
  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("[email protected]");
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", "三星", "[email protected]", false);
236         People p2 = new People("1002", "诺基亚", "[email protected]", false);
237         People p3 = new People("1003", "中兴", "[email protected]", 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", "三星", "[email protected]", false);
285         People p2 = new People("1002", "诺基亚", "[email protected]", false);
286         People p3 = new People("1003", "中兴", "[email protected]", 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":"[email protected]","vip":false},{"id":"1002","name":"\u8BFA\u57FA\u4E9A","email":"[email protected]","vip":false},{"id":"1003","name":"\u4E2D\u5174","email":"[email protected]","vip":true}]
2 #Mon Jan 09 23:54:36 CST 2017
3 apple={"id"\:"99","name"\:"apple","email"\:"[email protected]","vip"\:false}
4 huawei={"id"\:101,"name"\:"huawei","email"\:"[email protected]","vip"\:true}
5 info=[{"id"\:"1001","name"\:"\u4E09\u661F","email"\:"[email protected]","vip"\:false},{"id"\:"1002","name"\:"\u8BFA\u57FA\u4E9A","email"\:"[email protected]","vip"\:false},{"id"\:"1003","name"\:"\u4E2D\u5174","email"\:"[email protected]","vip"\:true}]
6 xiaomi={"id"\:1,"vip"\:true,"name"\:"xiaomi"}

5.拓展补充

时间: 2024-10-12 22:49:47

使用Gson解析Json的相关文章

android之GSON解析JSON

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库. 比如: <pre name="code" class="java">public class Order { public String id; public String OrderName; @Override public String toString() { return "id:"+id+",OrderNa

Android中使用Gson解析JSON数据的两种方法

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组

Android--------使用gson解析json文件

##使用gson解析json文件 **json的格式有两种:** **1. {}类型,及数据用{}包含:** **2. []类型,即数据用[]包含:** 下面用个例子,简单的介绍gson如何解析json,仅使用~ 先发两个json 内容 1.最外层是{} {             "resp": "ok",         "result": {             "date": "2013-4-19 16:

Google Gson解析Json数据应用实例

转自:http://lixigao449778967.blog.163.com/blog/static/24985164201269105928783/ 1.需要的Jar包 1) Google Gson(gson-xxx.jar)下载地址:http://code.google.com/p/google-gson/downloads/list 2)JUnit4 2. 应用实例代码 下载地址:http://download.csdn.net/source/3499627 包括如下类: 1)普通Jav

Android中利用Gson解析Json

在Android开发中,Json是一种客户端与服务器端交互的一种语言,它语法简单,最好的是目前市面上有很便捷的轮子可以对他进行解析.例如,Gson就是google提供的一款用于解析或者生成Json的库,可以直接将Json字符串映射成对应的实体类,十分方便.下面我总结一下利用Gson解析Json的用法以及我遇到的问题. 最简单对象的解析: 例如下边这段Json字符串: { text: "Love", img:"http://img2.imgtn.bdimg.com/it/u=2

大话JSON之Gson解析JSON

(三)解析Json数组(多条Json数据) 比如有如下Json数据: [{'name':'John', 'grade':[{'course':'English','score':100},{'course':'Math','score':78}]},  //注:Json数组最外层一定要加"[]" {'name':'Tom', 'grade':[{'course':'English','score':86},{'course':'Math','score':90}]}] 如何处理这样的数

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

我的Android进阶之旅------&gt;解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai", articletype: "1&

Gson解析Json数据

在Android开发中就经常用到json解析,方便的是Google已经为我们提供了一个很棒的json解析库–gson. 以下是示例代码: /** * GSON解析JSON数据 * @author dream * */ public class TestGsonActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method