Androidベース-JSONデータ解析

7029 ワード

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ライブラリ.以下、これら2つの技術を用いて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,addresssdresssssssONデータがjson=""""\\\\""""""""""""""""\"""":{"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配列が正しく解析されていることを示す.
new TypeToken>(){}.getType(); このコードは
TypeTokenの匿名サブクラスオブジェクトは、オブジェクトのgetType()メソッドを呼び出す.
org.jsonパッケージとgsonライブラリには他にも多くの有用なAPIがあり、必要に応じてドキュメントを表示することができます.例えばjavaオブジェクトやjava集合や配列からjsonデータを生成してサーバにアップロードする必要がある場合があります.もちろん、json文字列を自己構築することはできますが、面倒です.この时、その中のAPIを使って、便利にこの仕事を完成することができます.
変換元:http://coolxing.iteye.com/blog/1211403備考:異なる段階で基礎を見ると異なる収穫があり、Gsonの実現についてはよく知られていないが.