• android筆記--JSON數據解析

    0
    Android Java JSON C/C++ Go 21077 次瀏覽

    什么是JSON:

    JSON即JavaScript Object Natation, 它是一種輕量級的數據交換格式, 與XML一樣, 是廣泛被采用的客戶端和服務端交互的解決方案.

    JSON對象: JSON中對象(Object)以"{"開始, 以"}"結束. 對象中的每一個item都是一個key-value對, 表現為"key:value"的形式, key-value對之間使用逗號分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON對象的key只能是string類型的, 而value可以是string, number, false, true, null, Object對象甚至是array數組, 也就是說可以存在嵌套的情況.

    JSON數組: JSON數組(array)以"["開始, 以"]"結束, 數組中的每一個元素可以是string, number, false, true, null, Object對象甚至是array數組, 數組間的元素使用逗號分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].

     

    JSON數據的解析:解析JSON數據, 首先需要明確待解析的是JSON Object還是JSON array, 然后需要確定采用哪種解析技術. android平臺上一般有2種解析技術可供選擇: android內置的org.json包和google的開源gson庫. 以下將分別采用這兩種技術解析JSON對象和JSON數組.

    1.  采用android內置的org.json包解析JSON對象. 假設待解析的JSON數據為json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 其中\用于轉義表達式中的雙引號. 首先定義2個JavaBean:

    public class Address {
    	private String street;
    	private String city;
    	private String country;
    
    	public Address() {
    		super();
    	}
    
    	public Address(String street, String city, String country) {
    		super();
    		this.street = street;
    		this.city = city;
    		this.country = country;
    	}
    
    	public String getStreet() {
    		return street;
    	}
    
    	public void setStreet(String street) {
    		this.street = street;
    	}
    
    	public String getCity() {
    		return city;
    	}
    
    	public void setCity(String city) {
    		this.city = city;
    	}
    
    	public String getCountry() {
    		return country;
    	}
    
    	public void setCountry(String country) {
    		this.country = country;
    	}
    
    	@Override
    	public String toString() {
    		return "Address [street=" + street + ", city=" + city + ", country="
    				+ country + "]";
    	}
    
    }
    public class Person {
    	private String name;
    	private int age;
    	private boolean male;
    	private Address address;
    
    	public Person() {
    		super();
    	}
    
    	public Person(String name, int age, boolean male, Address address) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.male = male;
    		this.address = address;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public boolean isMale() {
    		return male;
    	}
    
    	public void setMale(boolean male) {
    		this.male = male;
    	}
    
    	public Address getAddress() {
    		return address;
    	}
    
    	public void setAddress(Address address) {
    		this.address = address;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", male=" + male
    				+ ", address=" + address + "]";
    	}
    
    }
    下面是具體的解析代碼:
    JSONObject jsonObject = new JSONObject(json);
    String name = jsonObject.getString("name");
    int age = jsonObject.getInt("age");
    boolean male = jsonObject.getBoolean("male");
    JSONObject addressJSON = jsonObject.getJSONObject("address");
    String street = addressJSON.getString("street");
    String city = addressJSON.getString("city");
    String country = addressJSON.getString("country");
    Address address = new Address(street, city, country);
    Person person = new Person(name, age, male, address);
    System.out.println(person);

    LogCat的輸出為Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 說明已經正確解析了JSON對象.

     

    2. 采用gson庫解析JSON對象. 假設帶解析的JSON數據是json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 首先需要到http://code.google.com/p/google-gson/下載jar包, 并將其添加到項目中. 具體的解析代碼如下:

    Gson gson = new Gson();
    Person person = gson.fromJson(json, Person.class);
    System.out.println(person);

    LogCat的輸出為Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 說明已經正確解析了JSON對象, 是不是很簡單?

     

    3. 采用android內置的org.json包解析JSON數組. 假設待解析的JSON數據為json = "[{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}, {\"name\":\"min\", \"age\"=20, \"male\":false, \"address\":{\"street\":\"heiShiJiao\", \"city\":\"daLian\", \"country\":\"china\"}}]", 解析代碼如下:

    List<Person> persons = new ArrayList<Person>();
    JSONArray jsonArray = new JSONArray(json);
    for(int i = 0; i < jsonArray.length(); i++) {
    	JSONObject jsonObject = jsonArray.getJSONObject(i);
    	String name = jsonObject.getString("name");
    	int age = jsonObject.getInt("age");
    	boolean male = jsonObject.getBoolean("male");
    	JSONObject addressJSON = jsonObject.getJSONObject("address");
    	String street = addressJSON.getString("street");
    	String city = addressJSON.getString("city");
    	String country = addressJSON.getString("country");
    	Address address = new Address(street, city, country);
    	Person person = new Person(name, age, male, address);
    	persons.add(person);
    }
    System.out.println(persons);

    LogCat的輸出為[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 說明已經正確解析了JSON數組.


    4. 采用gson庫解析JSON數組. 待解析的JSON數據同上, 具體代碼為:

    Gson gson = new Gson();
    Type listType = new TypeToken<List<Person>>(){}.getType();
    List<Person> persons = gson.fromJson(json, listType);
    LogCat的輸出為[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 說明已經正確解析了JSON數組.

    轉自:http://coolxing.iteye.com/blog/1211403

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色