12.3 JSON
8566 ワード
JSONはJavaScript Object Notationを表します.最初はJavaScriptに使うことを目的としていましたが、データ交換の形式としては言語には関係がありません.また、様々な理由(その中の一つが比較的容易に実現される)により、多くのWebサービスは、XML伝送データに基づく他のフォーマットの代替として利用されている.彼はXMLよりも軽量でコンパクトで、マシン分析が容易です.
Androidはorg.jsonのパッケージにJSONアナライザをバインドしています.
JSONデータを紹介する正確な文法は本書のテーマから逸脱しますが、JSONオブジェクトのプロトタイプ化表現を紹介します.
{result]:{anme]:Value、[[anumber]]:1234、「abooolean」:false]]
JSON表示では、括弧で囲まれた全体の表現が見られます.オブジェクトの名前は最初の文字列で、引用符の中にあり、続いてコロンです.すなわち「reult」です.次の括弧は、対象の一部となるすべてのデータを表します.各セグメントのデータは、同じように表示されています.名前は引用符にあり、後にコロンとなり、実際のデータとなります.文字列に引用符を使って明記します.引用符がない数字はただの数字です.ブール値はtrueまたはfalseで表される.最後に、データ配列は四角い括弧の中にある一連のオブジェクトで、オブジェクト間はコンマで区切られます.
次はanrrayという行列です.
{anrray]:「{arrayelement]」:「Aray Element 1」、「{arrayelement]」:「Aray Element 2」}
この配列には2つの要素があり、各要素は一つのオブジェクトであり、それらは「\」と「}」で囲まれ、オブジェクト間はコンマで区切られ、各オブジェクトは「arrayelement」と呼ばれる文字列を含んでいます.
次に、Android内蔵のJSONアナライザを使ってJSONデータを分析する方法を見ます.
まず以下の簡単なJSONデータを使います.
{result]:{anmame]:「Value」、「anumber」:1234、「aboolean」:false)、「anrray」:「{arrayelement]」:「Aray Element 1」、{arrayelement}、{arraryElement 2}
JSONアナライザを使用するためには、このデータは一文字列にある必要があります.このためには、二重引用符を変換する必要があります.
文字列を抽出するためには、JSONデータに指定された名前を入力しながら、get String方法を用いることができる.
Androidはorg.jsonのパッケージにJSONアナライザをバインドしています.
JSONデータを紹介する正確な文法は本書のテーマから逸脱しますが、JSONオブジェクトのプロトタイプ化表現を紹介します.
{result]:{anme]:Value、[[anumber]]:1234、「abooolean」:false]]
JSON表示では、括弧で囲まれた全体の表現が見られます.オブジェクトの名前は最初の文字列で、引用符の中にあり、続いてコロンです.すなわち「reult」です.次の括弧は、対象の一部となるすべてのデータを表します.各セグメントのデータは、同じように表示されています.名前は引用符にあり、後にコロンとなり、実際のデータとなります.文字列に引用符を使って明記します.引用符がない数字はただの数字です.ブール値はtrueまたはfalseで表される.最後に、データ配列は四角い括弧の中にある一連のオブジェクトで、オブジェクト間はコンマで区切られます.
次はanrrayという行列です.
{anrray]:「{arrayelement]」:「Aray Element 1」、「{arrayelement]」:「Aray Element 2」}
この配列には2つの要素があり、各要素は一つのオブジェクトであり、それらは「\」と「}」で囲まれ、オブジェクト間はコンマで区切られ、各オブジェクトは「arrayelement」と呼ばれる文字列を含んでいます.
次に、Android内蔵のJSONアナライザを使ってJSONデータを分析する方法を見ます.
まず以下の簡単なJSONデータを使います.
{result]:{anmame]:「Value」、「anumber」:1234、「aboolean」:false)、「anrray」:「{arrayelement]」:「Aray Element 1」、{arrayelement}、{arraryElement 2}
JSONアナライザを使用するためには、このデータは一文字列にある必要があります.このためには、二重引用符を変換する必要があります.
1 String JSONData=""+"{\"results\":{\"aname\":\"value\",\"anumber\":1234,\"aboolean\":false, "+"\"anarray\":[{\"arrayelement\":\"Array Element 1\"},{\"arrayelement\":\"Array Element 2\"}]}}";
Androidで利用できるJSONパッケージには、JSONObjectクラスが含まれており、JSONフォーマットに入力されたデータ(JSONDaa文字列に存在するデータなど)によって構成されてもよい.1 JSONObject overallJSONObject=new JSONObject(JSONData);
JSONObjectを取得すると、任意のJSONオブジェクト、JSON配列またはそれが含まれ得る従来のフィールドを提案することができる.結果はJSONオブジェクトであり、外部オブジェクトの内部に位置しているので、getJSONObject法を使用して抽出しようとしているオブジェクト名を入力することにより、その参照を得ることができる.1 JSONObject resultsObject=overallJSONObject.getJSONObject("results");
このJSONObjectオブジェクトを取得すると、それに含まれている任意のデータを抽出することができます.各配列タイプには異なる抽出方法があります.文字列を抽出するためには、JSONデータに指定された名前を入力しながら、get String方法を用いることができる.
1 String aname=resultsObject.getString("aname");
一つの整数を抽出するために、JSONデータに指定された名前を入力しながら、getInt方法を使用することができる.したがって、JSONデータは、get Double方法を用いて、ダブル精度数として抽出されてもよい.あるいはget Long法を使って長い整数として抽出します.1 int anumber=resultsObject.getInt("anumber");
ブール値を抽出するために、JSONデータに指定された名前を同時に入力するために、get Boolean法を用いることができる.1 boolean aboolean=resultsObject.getBoolean("aboolean");
以上の例のデータは、results Objectの中にもう一つのJSONオブジェクト配列があり、anrrayと呼ばれています.getJSONArray法を使用して、配列の参照を得ることができる.1 JSONArray anarray=resultsObject.getJSONArray("anarray");
JSONArray上のgetJSONObject法を使用して要素のインデックス番号を入力することにより、JSONArrayオブジェクトを遍歴し、その中の単一のJSONオブジェクト要素を抽出することができる.1 for(int i=0;i<anarray.length();i++){
2 JSONObject arrayElementObject=anarray.getJSONObject(i);
3 String arrayelement=arrayElementObject.getString("arrayelement");
4 }
以下は、上記のすべての内容をまとめた完全な例である. 1 package com.nthm.androidtestActivity;
2
3 import org.json.JSONArray;
4 import org.json.JSONException;
5 import org.json.JSONObject;
6 import android.app.Activity;
7 import android.os.Bundle;
8
9 public class SimpleJSON extends Activity {
10
11 @Override
12 protected void onCreate(Bundle savedInstanceState) {
13 super.onCreate(savedInstanceState);
14 String JSONData=""+"{\"results\":{\"aname\":\"value\",\"anumber\":1234,\"aboolean\":false, "+"\"anarray\":[{\"arrayelement\":\"Array Element 1\"},{\"arrayelement\":\"Array Element 2\"}]}}";
たくさんのJSONObjectとJSONArray方法をtry/catchブロックに包装する必要があります.彼らの多くの方法は例外を投げます.JSONObjectとJSONArrayの構造関数を含みます. 1 try{
2 JSONObject overallJSONObject=new JSONObject(JSONData);
3 JSONObject resultsObject=overallJSONObject.getJSONObject("results");
4 String aname=resultsObject.getString("aname");
5 int anumber=resultsObject.getInt("anumber");
6 boolean aboolean=resultsObject.getBoolean("aboolean");
7 JSONArray anarray=resultsObject.getJSONArray("anarray");
8 for(int i=0;i<anarray.length();i++){
9 JSONObject arrayElementObject=anarray.getJSONObject(i);
10 String arrayelement=arrayElementObject.getString("arrayelement");
11 }
12 }catch(JSONException e){
多くの捕獲の異常はJSONExceptionの例であり、解析時にエラーが発生したことを示している.ここでは出力スタックの追跡だけです.あなたのアプリケーションでは、エラーメッセージをユーザに表示するか、またはエラーを生成するステップを削除して分析を続けるなど、より柔軟な処理をしたいかもしれません.1 e.printStackTrace();
2 }
3 }
4 }
前に示したように、JSONデータの解析の基礎は非常に簡単である.次に、JSONデータに対するHTTP要求をまとめてどのようにするかを実際の例で検討する.