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テキストを構築する
getTypeとoptType apiの使用
getTypeは、取得するキーの値を指定したタイプに変換し、変換できない場合や値がない場合はJSONExceptionを放出します.
optTypeも取得するキーの値を指定したタイプに変換し、値が変換できない場合や値がない場合はユーザーが提供した値またはデフォルトで提供した値を返します.
上の2つのクラスに加えて、JSOnStringerを使用してjsonテキストを構築することもできます.
Javaコード
jsonテキスト解析クラスJSONTokenerは、RFC 4627仕様に従ってjsonテキストを対応するオブジェクトに解析する.jsonテキストをオブジェクトとして解析するには、クラスの2つのapi:コンストラクション関数public Object nextValue()と、クラスの2つのapiのみが必要です.
他のapiは基本的にjsonテキストのテキストを表示するために使用されます.
以下は、標準的なJSONリクエスト実装プロセスです.
以下は自分で他人を修正する小さな例で、主にいくつかの注釈と説明を加えて、この例は主にandroidを使ってjson解析を行います.
次のクラスは、主に単一のデータparseJson()と複数のデータを解析する方法parseJsonMulti()です.
軽量レベルのデータ交換フォーマットで、読み取りやすく、迅速に作成しやすい特性を備えています.業界の主流テクノロジーは、正規表現に似ており、現在のほとんどの言語でサポートされている完全なソリューションを提供し、異なるプラットフォーム間でデータ交換を行うことができます.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();
}
}
}