灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子
package com.app.json; import java.util.ArrayList;import java.util.Iterator;import java.util.List;import net.sf.json.JSONArray;import com.app.entity.duapp.Address;import com.google.gson.Gson;import com.google.gson.JsonArray;import com.google.gson.JsonElement;import com.google.gson.JsonObject;import com.google.gson.JsonParser;/** *@DEMO:napp *@Author:jilongliang *@Date:2013-7-20 */public class JsonParse { private static Gson gson=new Gson(); /** * 通过JsonLib把数组转换成Json数据 * @param url * @throws Exception */private static JSONArray getArrayToJsonByJsonLib()throws Exception{JSONArray jsonArr=null;List<Address> lists=new ArrayList<Address>();for (int i = 1; i <=12; i++) {Address addr = new Address(); addr.setProvince("第"+i+"个省份");addr.setCity("第"+i+"个城市");addr.setCityCode("130"+i);addr.setStreet("街道"+i);addr.setStreetNumber("街道号码"+i);lists.add(addr);}jsonArr = JSONArray.fromObject(lists); //把对象转换成Json对象return jsonArr;}public static void main(String[] args)throws Exception{getJsonGson(); }/** * 利用Json-lib封装数组Json数据,Gson解析Json数据. * @throws Exception */private static void getJsonGson() throws Exception {//Json-lib的JSONArray数组对象JSONArray JsonArray =getArrayToJsonByJsonLib();String jsonData=JsonArray.toString();/* * 自己组装成一个json格式,格式必须为{,,}才能为JsonElement对象的parse方法解析不是否则 * 会报错com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 1307 */String json="{status:1,address:"+jsonData+"}";// 创建一个JsonParserJsonParser parser = new JsonParser();JsonElement jsonEl = parser.parse(json);JsonObject jsonObj = null;jsonObj = jsonEl.getAsJsonObject();//转换成Json对象String status=jsonObj.get("status").getAsString();//status节点//System.out.println(status);JsonElement addressEl=jsonObj.get("address");//address节点if(addressEl.isJsonArray()){//判断是否为Json数组JsonArray jsonArray= addressEl.getAsJsonArray();//转为数组for(Iterator iter=jsonArray.iterator();iter.hasNext();){JsonObject obj=(JsonObject) iter.next();//String city=obj.get("city").getAsString();//方法一:根据key形势取值Address add=gson.fromJson(obj, Address.class);//方法二:灵活使用Gson取数据System.out.println(add.getProvince()+"\t"+add.getCity()); }}} }
?json数据是由运行JsonRead类可以生成
{"info":{"users":{"username":"liangjilong","email":"jilongliang@sina.com","tel":"12396878","age":"25"},"address":{"street":"棠东","province":"广东省","district":"天河区","city":"广州市"}}}
?JsonRead
package com.app.json;import java.io.IOException;import java.io.InputStream;import java.io.StringReader;import java.util.HashMap;import java.util.Map;import com.google.gson.Gson;import com.google.gson.stream.JsonReader;/** *@DEMO:napp *@Author:jilongliang *@Date:2013-7-20 */public class JsonRead {private static Gson gson=new Gson();/** * @param args */public static void main(String[] args) throws Exception{ getJsonData(); //方法二 //String pathname="src/config/doc/json"; //InputStream input = new FileInputStream(new File(pathname)); //readJsonData(input,null);}/** * 组装Json数据 * @throws Exception */private static void getJsonData() throws Exception {/** * 组装address对象的数据 */ Map<String, String> address = new HashMap <String, String>(); address.put("province", "广东省"); address.put("city", "广州市"); address.put("district", "天河区"); address.put("street", "棠东"); /** * 组装users对象的数据 */ Map<String, String> users = new HashMap <String, String>(); users.put("username", "liangjilong"); users.put("age", "25"); users.put("tel", "12396878"); users.put("email", "jilongliang@sina.com"); Map<Object, Object> listsObj = new HashMap <Object, Object>(); listsObj.put("address",address);//address节点 listsObj.put("users",users);//users节点 Object obj=listsObj;//转换成对象 Map<Object, Object> info = new HashMap <Object, Object>(); info.put("info", obj);//json的根节点 String json=gson.toJson(info);//转换成json数据 System.out.println(json);//打印json数据 readJsonData(null,json);}/** * 从文件读取json数据 * @param in * @throws Exception */public static void readJsonData(InputStream in,String json) throws Exception {//JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));JsonReader reader = new JsonReader(new StringReader(json));try {reader.beginObject();String tagName = reader.nextName();if (tagName.equals("info")) {readInfo(reader);}reader.endObject();} finally {reader.close();}}/** * 读取json的父(根,第一个)节点 * @param reader * @throws Exception */public static void readInfo(JsonReader reader) throws Exception {reader.beginObject();while (reader.hasNext()) {String tagName = reader.nextName();if (tagName.equals("address")) {readAddress(reader);} else if (tagName.equals("users")) {readUsers(reader);} }reader.endObject();}/** * 读取用户信息值 * @param reader * @throws IOException */public static void readUsers(JsonReader reader) throws IOException {reader.beginObject();while (reader.hasNext()) {String tag = reader.nextName();if (tag.equals("username")) {String username = reader.nextString();System.out.println("用户名:" + username);} else if (tag.equals("email")) {String email = reader.nextString();System.out.println("Email:" + email);} else if (tag.equals("tel")) {String tel = reader.nextString();System.out.println("电话:" + tel);}else if (tag.equals("age")) {String age = reader.nextString();System.out.println("年龄:" + age);} else {reader.skipValue();//忽略值/跳过break}}reader.endObject();}/** * 读取地区值 * @param reader * @throws IOException */public static void readAddress(JsonReader reader) throws IOException {reader.beginObject();while (reader.hasNext()) {String tag = reader.nextName();if (tag.equals("province")) {String province = reader.nextString();System.out.println("省份:" + province);} else if (tag.equals("city")) {String city = reader.nextString();System.out.println("街道:" + city);} else if (tag.equals("street")) {String street = reader.nextString();System.out.println("街道:" + street);}else if (tag.equals("district")) {String district = reader.nextString();System.out.println("区:" + district);} else {reader.skipValue();//忽略值/跳过break}}reader.endObject();}}
?实体类:
package com.app.entity.duapp;import java.io.Serializable;import com.google.gson.annotations.Expose;/** * 使用 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); * 创建Gson对象,没有@Expose注释的属性将不会被序列化 * serialize序列化 默认 true * deserialize反序列化 默认 true * */public class Address implements Serializable{@Expose(serialize=false)// 序列化 /类已经序列化private String streetNumber;@Expose(deserialize=false)// 反序列化private String street;private String district;private String city;private String province;private String cityCode;public String getCityCode() {return cityCode;}public void setCityCode(String cityCode) {this.cityCode = cityCode;}public String getStreetNumber() {return streetNumber;}public void setStreetNumber(String streetNumber) {this.streetNumber = streetNumber;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}public String getDistrict() {return district;}public void setDistrict(String district) {this.district = district;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}}
?