Android原生json類org.json.JSONObject初歩使用


Androidオリジナルjsonクラスは簡単ないくつかの方法しか提供されておらず、beanを内蔵した操作もありませんが、実はandroidオリジナルなので、サポートしたほうがいいです.例えば、サーバ側でよく使われるjson-libというライブラリは、json-libの依存パッケージcommons-collectionがサポートできないためandroidでは使用できません.
まず、最も一般的な方法は、json文字列からキー名に基づいて対応する値を取得することです.
1、new JSONObjectオブジェクト、構造にjson文字列を入れる
2、jsonObjectオブジェクトのgetString(「属性名」)、getInt(「属性名」)、またはget(「属性名」)メソッドで対応する値を得る
JSONObject jsonObject;
		try {
			jsonObject = new JSONObject("{name:'jack',age:12}");
			String name = jsonObject.getString("name");
			int age = jsonObject.getInt("age");
			System.out.println(name+age);
		} catch (JSONException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

json文字列をjava対応クラスのオブジェクトに解析したい場合は、jsonObjectのオリジナルメソッドは期待できませんが、jsonObjectクラスを継承し、反射を利用してjson文字列をオブジェクトに変換するメソッドを追加することができます.この継承クラスは次のようになります.
package com.example.http_test;

import java.lang.reflect.Field;

import org.json.JSONObject;

public class SituJsonObject extends JSONObject {
	public SituJsonObject(String jsonString) throws Exception{
		super(jsonString);
	}
	
	/**
	 *    json        java    
	 * @param cls
	 * @return
	 * @throws Exception
	 */
	public Object getBean(Class cls) throws Exception
	{	
		//        
		Object obj = cls.newInstance();
		//         
		Field[] fs = cls.getDeclaredFields();
		//       , json      ,       
		for (int i = 0; i < fs.length; i++) {
			String name = fs[i].getName();
			fs[i].setAccessible(true);//          
			// json            
			Object value = this.get(name);
			if(value==null)continue;
			//              
			fs[i].set(obj, value);
		}
		return obj;
	}
}

これにより、元のjsonObjectクラスよりもgetBeanメソッドが1つ多くなり、classファイルを1つ転送するだけで済みます.
注意:転送されたclassは内部クラスにはできません!!!
注意:転送されたclassは内部クラスにはできません!!!
注意:転送されたclassは内部クラスにはできません!!!
重要なことを3回話して、簡単にテストしてみましょう.
まず簡単なjavaクラスを書きます
注意:javaクラスにget、setメソッドは必要ありません
public class Person {
	String name;
	int age;
}
SituJsonObject situJsonObject = null;
		try {
			situJsonObject = new SituJsonObject("{name:'jack',age:12}");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("json       ");
		}
		
		Person p;
		try {
			p = (Person) situJsonObject.getBean(Person.class);
			System.out.println("person "+p.name+p.age);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("    ");
		}

json文字列のフォーマットが間違っていなければ、許容すれば成功するはずです.intタイプのjson文字列に二重引用符をつけないでください.この原生類はまだ自動的にparseIntを行うことができません.
原生にはもう一つのjsonArrayがあり、その中でよく使われる機能はget(下付き)で、この配列が下付きの値(object)に対応することを取り出すために使われています.
対応するjavaクラスを取得するための2つの方法も追加しました
package com.example.http_test;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class SituJsonArray extends JSONArray {
	public SituJsonArray(String Jsons) throws JSONException
	{
		super(Jsons);
	}
	
	/**
	 *               JSONObject  
	 * @param index
	 * @return
	 * @throws Exception
	 */
	public JSONObject getJsonObject(int index) throws Exception
	{
		return new SituJsonObject(get(index).toString());
	}
	
	/**
	 *         java   ,                 
	 * @param index
	 * @param cls
	 * @return
	 * @throws JSONException
	 * @throws Exception
	 */
	public Object getObject(int index, Class cls) throws JSONException, Exception
	{
		return new SituJsonObject(get(index).toString()).getBean(cls);
	}

}

これがあれば、ちょっと遍歴するだけでjson配列の各クラスを1つずつ取り出すことができますが、この配列には1つのタイプのオブジェクトしか保存できないことが条件で、次のテストをします.
//json     
		SituJsonArray situJsonArray = null;
		try {
			situJsonArray = new SituJsonArray("[{name='one',age=20},{name='two',age=30}]");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("json       ");
		}
		try {
			//     jsonObject  
                        System.out.println(situJsonArray.getJsonObject(0));
			System.out.println(situJsonArray.getJsonObject(1));
                        //  java  
                        System.out.println(situJsonArray.getObject(0,Person.class));
			System.out.println(situJsonArray.getObject(1,Person.class));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("    ");
		}

ではどのようにJsonObjectで1つのjson文字列を生成して、答えは1つの属性の1つの属性の上へputだけで、jsonObjectも普通のクラスがjsonの方法を回転することを提供していません
次のようになります.
JSONObject jsonObject = new JSONObject();
		try {
			jsonObject.put("name", "jack");
			jsonObject.put("age", 12);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(jsonObject.toString());
	}

出力結果:{"age":12,"name":"jack"}
では、先ほどの考え方に従って、私たちがカスタマイズしたSituJsonObjectに方法を加えて、反射でクラスのすべてのメンバーを書きます.このクラスをwriteBeanと呼んでもいいです.
注意:この方法はjavaクラスにget、setメソッドがある必要はありません.
public void writeBean(Object obj) throws IllegalAccessException, IllegalArgumentException, JSONException{
		Class cls = obj.getClass();
		Field[] fs = cls.getDeclaredFields();
		//       , json      ,       
		for (int i = 0; i < fs.length; i++) {
			String name = fs[i].getName();
			fs[i].setAccessible(true);//          
			Object value = fs[i].get(obj);//            
			this.put(name, value);
		}
	}

簡単な書き込みテストを行います.
SituJsonObject situJsonObject = new SituJsonObject();
		try {
			situJsonObject.writeBean(new Person("lixiao", 14));//                JsonOBject     ,       put 
			System.out.println(situJsonObject.toString());
		} catch (IllegalAccessException | IllegalArgumentException
				| JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("    ");
		}

テスト結果:{"age":14,"name":"lixiao"}
json文字列配列を生成するには、単一オブジェクトのjson文字列を単純に加算すれば良いので、JSOnArrayクラスを使用する必要はありません
jsonObjectにもう一つの方法を追加してgetArrayStringと呼びましょう.listをパラメータとして受け入れ、前に書いたwriteBeanを利用して、json文字列をつなぎ合わせて、利用可能な文字列を直接返します.
public String getArrayString(List<Object> list) throws IllegalAccessException, IllegalArgumentException, JSONException{
		StringBuffer sBuffer = new StringBuffer();
		sBuffer.append("[");
		for (Object object : list) {//      json       
			SituJsonObject situJsonObject = new SituJsonObject();
			situJsonObject.writeBean(object);
			sBuffer.append(situJsonObject.toString()).append(",");
		}
		sBuffer.deleteCharAt(sBuffer.length()-1);//        
		sBuffer.append("]");
		return sBuffer.toString();
	}

結果は、[{"age":10,"name":"wang"},{"age":10,"name":"wang"},{"age":10,"name":"wang"},{"age":10,"name":"wang"},{"age":10,","name":"wang"},{"age":10,"name":"wang"},{"age":10,"name":"wang"},{"age":10,","name":"wang"},{age":10,{name","wang"},{age":10,"name":"wang"},{
Android原生のこの2つのクラスは修正後、いくつかの簡単な場面で使用するのは悪くないが、筆者はアリババのfastjsonクラスを使うことをお勧めしている.このjarパッケージにはandroid専用のバージョンがあり、互換性がよく、json-libとの差が少なく、最も貴重なのはjackJsonよりも速度が速いということだ.しかもバッグに頼る必要はなく、コンパクトで軽量で、本人のブログにアップロードしました.http://download.csdn.net/detail/lvshaorong/9187375あ、現在のアンドロイドの最新バージョンです