android Json解析の詳細(詳細コード)

12466 ワード

JSONの定義:
軽量レベルのデータ交換フォーマットで、読み取りやすく、迅速に作成しやすい特性を備えています.業界の主流テクノロジーは、正規表現に似ており、現在のほとんどの言語でサポートされている完全なソリューションを提供し、異なるプラットフォーム間でデータ交換を行うことができます.JSONは互換性の高いテキスト形式を採用し、C言語体系のような行為も備えている-Json.org
JSON Vs XML
1.JSONとXMLのデータ可読性はほぼ同じ
2.JSONはXMLと同様に豊富な解析手段を持っている
3.JSONはXMLに対してデータの体積が小さい
4.JSONとJavaScriptのやりとりがより便利
5.JSONデータの記述性がXMLより劣る
6.JSONの速度はXMLよりはるかに速い
pull解析xmlの詳細:http://blog.csdn.net/onlyonecoder/article/details/8489170
android2.3提供するjson解析クラス
Androidのjson解析部分はすべてパッケージorg.jsonでは、主に以下のクラスがあります.
JSONObject:JSONの定義に関する基本単位であり、ペア(Key/Value)の数値を含むjsonオブジェクトと見なすことができます.外部(External:toString()メソッドを適用して出力される数値)呼び出しに対する応答は、標準的な文字列(たとえば、{「JSON」:「Hello,World」}、最も外側は括弧で囲まれ、その中のKeyとValueは「:」で区切られている)として表されます.内部(Internal)の動作に対する動作フォーマットは、例えば、JSOnObjectのインスタンスを初期化し、内部のput()メソッドを参照して数値を追加する:new JSOnObject()である.put("JSON", "Hello, World!"),KeyとValueの間にはカンマ","で区切られています.Valueのタイプには、Boolean、JSOnArray、JSOnObject、Number、String、またはデフォルト値JSOnObjectがある.NULL object .
JSOnStringer:jsonテキスト構築クラスです.公式の説明によると、このクラスはJSON textの迅速かつ容易な作成を助けることができます.その最大の利点は,フォーマットの誤りによるプログラム異常を低減できることであり,このクラスを参照するとJSON構文規則(syntax rules)に従ってJSON textを自動的に厳密に作成できることである.JSOnStringerエンティティごとに1つのJSON textしか作成できません.その最大の利点は,フォーマットの誤りによるプログラム異常を低減できることであり,このクラスを参照するとJSON構文規則(syntax rules)に従ってJSON textを自動的に厳密に作成できることである.JSOnStringerエンティティごとに1つのJSON textしか作成できません.
JSOnArray:秩序化された数値のセットを表します.これをString出力(toString)に変換して表現する形式は、角カッコで囲まれ、数値はカンマで囲まれている」、「区切り([value 1,value 2,value 3]、短いコードを使ってフォーマットをより直感的に理解することができます).このクラスの内部にはクエリー動作もあり、get()とopt()の両方のメソッドはindexインデックスで指定した数値を返すことができ、put()メソッドは数値を追加または置換するために使用されます.同様に、このクラスのvalueタイプには、Boolean、JSOnArray、JSOnObject、Number、String、またはデフォルト値JSOnObjectが含まれる.NULL object.
JSONTokener:json解析クラスJSONException:jsonで使用される例外
JSOnObject,JSOnArrayでjsonテキストを構築する
    //            json    
    //  {  
    //      "phone" : ["12345678", "87654321"], //     
    //      "name" : "yuanzhifei89", //      
    //      "age" : 100, //     
    //      "address" : { "country" : "china", "province" : "jiangsu" }, //     
    //      "married" : false //      
    //  }  
      
    try {  
        //       {},         
        JSONObject person = new JSONObject();  
        //     phone     ,            
        JSONArray phone = new JSONArray();  
        phone.put("12345678").put("87654321");  
        person.put("phone", phone);  
      
        person.put("name", "yuanzhifei89");  
        person.put("age", 100);  
        //  address     ,            
        JSONObject address = new JSONObject();  
        address.put("country", "china");  
        address.put("province", "jiangsu");  
        person.put("address", address);    
        person.put("married", false);  
    } catch (JSONException ex) {  
        //   null   json        (NaN, infinities)  
        throw new RuntimeException(ex);  
    }  

getTypeとoptType apiの使用
getTypeは、取得するキーの値を指定したタイプに変換し、変換できない場合や値がない場合はJSONExceptionを放出します.
optTypeも取得するキーの値を指定したタイプに変換し、値が変換できない場合や値がない場合はユーザーが提供した値またはデフォルトで提供した値を返します.
    try {  
        //                    
        //                         
        phone.getLong(0);  
        person.getLong("name"); //     ,         long        
        phone.optLong(0); //           
        phone.optLong(0, 1000); //           
        person.optLong("name");  
        person.optLong("name", 1000); //          ,    1000  
    } catch (JSONException ex) {  
        //         
    }  

上の2つのクラスに加えて、JSOnStringerを使用してjsonテキストを構築することもできます.
  
Javaコード
    try {  
        JSONStringer jsonText = new JSONStringer();  
        //    {,    。object endObject        
        jsonText.object();  
          
        jsonText.key("phone");  
        //  phone     。array endArray        
        jsonText.array();  
        jsonText.value("12345678").value("87654321");  
        jsonText.endArray();  
          
        jsonText.key("name");  
        jsonText.value("yuanzhifei89");  
        jsonText.key("age");  
        jsonText.value(100);  
          
        jsonText.key("address");  
        //  address       
        jsonText.object();  
        jsonText.key("country");  
        jsonText.value("china");  
        jsonText.key("province");  
        jsonText.value("jiangsu");  
        jsonText.endObject();  
          
        jsonText.key("married");  
        jsonText.value(false);  
          
        // },      
        jsonText.endObject();  
    } catch (JSONException ex) {  
        throw new RuntimeException(ex);  
    }  

jsonテキスト解析クラスJSONTokenerは、RFC 4627仕様に従ってjsonテキストを対応するオブジェクトに解析する.jsonテキストをオブジェクトとして解析するには、クラスの2つのapi:コンストラクション関数public Object nextValue()と、クラスの2つのapiのみが必要です. 
    //  {  
    //      "phone" : ["12345678", "87654321"], //     
    //      "name" : "yuanzhifei89", //      
    //      "age" : 100, //     
    //      "address" : { "country" : "china", "province" : "jiangsu" }, //     
    //      "married" : false //      
    //  }  
      
    private static final String JSON =   
    "{" +  
        "   \"phone\" : [\"12345678\", \"87654321\"]," +  
        "   \"name\" : \"yuanzhifei89\"," +  
        "   \"age\" : 100," +  
        "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +  
        "   \"married\" : false," +  
    "}";  
      
    try {  
        JSONTokener jsonParser = new JSONTokener(JSON);  
        //         json  ,        JSONObject  。  
        //           "name" :  ,  nextValue  "yuanzhifei89"(String)  
        JSONObject person = (JSONObject) jsonParser.nextValue();  
        //       JSON        
        person.getJSONArray("phone");  
        person.getString("name");  
        person.getInt("age");  
        person.getJSONObject("address");  
        person.getBoolean("married");  
    } catch (JSONException ex) {  
        //         
    }  

他のapiは基本的にjsonテキストのテキストを表示するために使用されます.
    try {  
        JSONTokener jsonParser = new JSONTokener(JSON);  
        //      8 json      。     ,  {   
        jsonParser.next(8); //{    "phone。tab       
          
        //      1 json        
        jsonParser.next(); //"  
          
        //         json      。       、             
        jsonParser.nextClean(); //:  
          
        //                'a'      (   a)。  
        jsonParser.nextString('a'); //  ["12345678", "87654321"],    "n(       )  
          
        //                   ( "0089")          ,      trimmed 。(          89)  
        jsonParser.nextTo("0089"); //me" : "yuanzhifei  
          
        //           
        jsonParser.back();  
        jsonParser.next(); //i  
          
        //              (     )  
        jsonParser.skipPast("address");  
        jsonParser.next(8); //" : { "c  
          
        //             (     )  
        jsonParser.skipTo('m');  
        jsonParser.next(8); //married"  
    } catch (JSONException ex) {  
        //         
    }  

以下は、標準的なJSONリクエスト実装プロセスです.
HttpPost request = new HttpPost(url); 
//       JSON    
JSONObject param = new JSONObject(); 
param.put("name", "rarnu"); 
param.put("password", "123456"); 
//       Entry 
StringEntity se = new StringEntity(param.toString());  
request.setEntity(se); 
//      
HttpResponse httpResponse = new DefaultHttpClient().execute(request); 
//         ,      JSON         
String retSrc = EntityUtils.toString(httpResponse.getEntity()); 
//    JSON    
JSONObject result = new JSONObject( retSrc); 
String token = result.get("token");

以下は自分で他人を修正する小さな例で、主にいくつかの注釈と説明を加えて、この例は主にandroidを使ってjson解析を行います.
   {'singer':{'id':1,'name':'tom','gender':' '}} 
    {'singers':[{'id':'2','name':'tom','gender':' '},{'id':'3','name':'jerry','gender':' '},{'id':'4','name':'jim','gender':' '},{'id':'5','name':'lily','gender':' '}]}                                                                            

                                             
次のクラスは、主に単一のデータparseJson()と複数のデータを解析する方法parseJsonMulti()です.
public class JsonActivity extends Activity { 
	/** Called when the activity is first created. */ 
	private TextView tvJson; 
	private Button btnJson; 
	private Button btnJsonMulti; 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); 
		tvJson = (TextView) this.findViewById(R.id.tvJson); 
		btnJson = (Button) this.findViewById(R.id.btnJson); 
		btnJsonMulti = (Button) this.findViewById(R.id.btnJsonMulti); 
		btnJson.setOnClickListener(new View.OnClickListener() { 
			@Override 
			public void onClick(View v) { 
				// url 
				// String strUrl = "http://10.158.166.110:8080/AndroidServer/JsonServlet"; 
				String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGER); 
				//     Json    
				String strResult = connServerForResult(strUrl); 
				//  Json    
				parseJson(strResult); 
			} 
		}); 
		btnJsonMulti.setOnClickListener(new View.OnClickListener() { 
			@Override 
			public void onClick(View v) { 
				String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGERS); 
				String strResult = connServerForResult(strUrl); 
				//    Singer 
				parseJsonMulti(strResult); 
			} 
		}); 
	} 
	private String connServerForResult(String strUrl) { 
		// HttpGet   
		HttpGet httpRequest = new HttpGet(strUrl); 
		String strResult = ""; 
		try { 
			// HttpClient   
			HttpClient httpClient = new DefaultHttpClient(); 
			//   HttpResponse   
			HttpResponse httpResponse = httpClient.execute(httpRequest); 
			if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
				//         
				strResult = EntityUtils.toString(httpResponse.getEntity()); 
			} 
		} catch (ClientProtocolException e) { 
			tvJson.setText("protocol error"); 
			e.printStackTrace(); 
		} catch (IOException e) { 
			tvJson.setText("IO error"); 
			e.printStackTrace(); 
		} 
		return strResult; 
	} 
	//   Json     
	private void parseJson(String strResult) { 
		try { 
			JSONObject jsonObj = new JSONObject(strResult).getJSONObject("singer"); 
			int id = jsonObj.getInt("id"); 
			String name = jsonObj.getString("name"); 
			String gender = jsonObj.getString("gender"); 
			tvJson.setText("ID "+id + ",   :" + name + ",  :" + gender); 
		} catch (JSONException e) { 
			System.out.println("Json parse error"); 
			e.printStackTrace(); 
		} 
	} 
    //       Json
	private void parseJsonMulti(String strResult) { 
		try { 
			JSONArray jsonObjs = new JSONObject(strResult).getJSONArray("singers"); 
			String s = ""; 
			for(int i = 0; i < jsonObjs.length() ; i++){ 
				JSONObject jsonObj = (JSONObject)jsonObjs.get(i); 
				int id = jsonObj.getInt("id"); 
				String name = jsonObj.getString("name"); 
				String gender = jsonObj.getString("gender"); 
				s +=  "ID "+id + ",   :" + name + ",  :" + gender+ "
" ;  }  tvJson.setText(s);  } catch (JSONException e) {  System.out.println("Jsons parse error !");  e.printStackTrace();  }  }  }