AndroidでJSONフィードを解析する方法
注:この回答は2013年以降更新されていません。hspクライアントはapi 23の時点でsdkから削除されているため、推奨されるjsonのダウンロード方法はAndroidでは推奨されません。
ただし、以下の解析ロジックは依然として適用されます
Androidには、jsonを解析するために必要なすべてのツールが組み込まれています。例が続きますが、GSONやそのようなものは必要ありません。
あなたのJSONを入手してください:
DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
HttpPost httppost = new HttpPost(http://someJSONUrl/jsonWebService);
// Depends on your web service
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;
String result = null;
try {
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
// json is UTF-8 by default
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception e) {
// Oops
}
finally {
try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
}
jSONができました。
JSONObject を作成します。
JSONObject jObject = new JSONObject(result);
特定の文字列を取得する
String aJsonString = jObject.getString("STRINGNAME");
特定のブール値を取得する
boolean aJsonBoolean = jObject.getBoolean("BOOLEANNAME");
特定の整数を取得する
int aJsonInteger = jObject.getInt("INTEGERNAME");
特定の長さを取得する
long aJsonLong = jObject.getLong("LONGNAME");
特定の倍精度を取得する
double aJsonDouble = jObject.getDouble("DOUBLENAME");
特定の JSONArray を取得するには、
JSONArray jArray = jObject.getJSONArray("ARRAYNAME");
配列からアイテムを取得する
for (int i=0; i < jArray.length(); i++)
{
try {
JSONObject oneObject = jArray.getJSONObject(i);
// Pulling items from the array
String oneObjectsItem = oneObject.getString("STRINGNAMEinTHEarray");
String oneObjectsItem2 = oneObject.getString("anotherSTRINGNAMEINtheARRAY");
} catch (JSONException e) {
// Oops
}
}
JSONパーサークラスを書く
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {}
public JSONObject getJSONFromUrl(String url) {
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
JSONデータの解析
パーサークラスを作成したら、次にそのクラスの使い方を知ることです。以下で私はパーサークラスを使用して(この例では取られる)JSONを解析する方法を説明しています。
2.1。これらすべてのノード名を変数に格納します。contacts jsonには、名前、電子メール、住所、性別、電話番号などの項目があります。そのため、まず最初に、これらすべてのノード名を変数に格納します。メインのアクティビティクラスを開き、すべてのノード名を静的変数に宣言します。
// url to make request
private static String url = "http://api.9Android.net/contacts";
// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";
// contacts JSONArray
JSONArray contacts = null;
2.2。パーサークラスを使用してJSONObject
を取得し、各json項目をループ処理します。以下ではJSONParser
クラスのインスタンスを作成し、forループを使用して各json項目をループ処理し、最後に各jsonデータを変数に格納しています。
// Creating JSON Parser instance
JSONParser jParser = new JSONParser();
// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);
try {
// Getting Array of Contacts
contacts = json.getJSONArray(TAG_CONTACTS);
// looping through All Contacts
for(int i = 0; i < contacts.length(); i++){
JSONObject c = contacts.getJSONObject(i);
// Storing each json item in variable
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
String address = c.getString(TAG_ADDRESS);
String gender = c.getString(TAG_GENDER);
// Phone number is agin JSON Object
JSONObject phone = c.getJSONObject(TAG_PHONE);
String mobile = phone.getString(TAG_PHONE_MOBILE);
String home = phone.getString(TAG_PHONE_HOME);
String office = phone.getString(TAG_PHONE_OFFICE);
}
} catch (JSONException e) {
e.printStackTrace();
}
私はあなたのための簡単な例をコーディングし、そしてソースに注釈を付けました。この例は、ライブjsonを取得して詳細抽出のためにJSONObject
に解析する方法を示しています。
try{
// Create a new HTTP Client
DefaultHttpClient defaultClient = new DefaultHttpClient();
// Setup the get request
HttpGet httpGetRequest = new HttpGet("http://example.json");
// Execute the request in the client
HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
// Grab the response
BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
String json = reader.readLine();
// Instantiate a JSON object from the request response
JSONObject jsonObject = new JSONObject(json);
} catch(Exception e){
// In your production code handle any errors and catch the individual exceptions
e.printStackTrace();
}
必要なデータを抽出する方法の詳細については、JSONObject
を取得したら SDK を参照してください。