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+"}";

		//     JsonParser
		JsonParser 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":"[email protected]","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", "[email protected]"); 
		 
		 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;
	}
	
}