使用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.拓展补充