JSON解析GSON解析
16501 ワード
json解析
1、jsonは軽量レベルのデータ交換フォーマットを定義し、良好な読み取りと迅速な作成が容易な特性を有する.業界の主流テクノロジーは、正規表現に似ており、現在のほとんどの言語でサポートされている完全なソリューションを提供し、異なるプラットフォーム間でデータ交換を行うことができます.JSONは互換性の高いテキスト形式を採用し、C言語体系に類似した行為も備えている.2、表示形式(1)の名称/値の対は最も簡単な形式で、以下のようなJSONで表すことができる」名称/値の対:{"firstName":"Brett"}この例は非常に基本的で、実際には等価な純粋なテキスト"名称/値の対"よりも多くの空間を占有する:firstName=Brettしかし、複数の"名称/値の対"をつなぎ合わせると、JSONはその価値を体現します.まず、{"firstName":"Brett","lastName":"McLaughlin","email":"aaaaa"}など、複数の"名前/値ペア"を含むレコードを作成できます.これは文法的には"名前/値ペア"に比べて大きなメリットはありませんが、この場合JSONの方が使いやすく、読みやすさが向上します.例えば、以上の3つの値が同じレコードの一部であることを明確に示す.カッコはこれらの値に何らかのつながりをもたらします.(2)配列を表す値のセットを表す必要がある場合、JSONは可読性を向上させるだけでなく、複雑さを低減することができる.たとえば、人名リストを表示したいとします.XMLでは、多くの開始タグと終了タグが必要です.通常の名前/値ペア(本シリーズの前の記事で見たような名前/値ペア)を使用する場合は、独自のデータフォーマットを確立するか、キー名をperson 1-firstNameのような形式に変更する必要があります.JSONを使うと、かっこの付いた複数のレコードをグループ化するだけです:{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cc"}]}これは理解に難くない.この例ではpeopleという変数は1つしかありません.値は3つのエントリを含む配列で、各エントリは名前、姓、電子メールアドレスを含む1人のレコードです.上記の例では、記録をカッコで1つの値に組み合わせる方法を示します.もちろん、同じ構文を使用して、複数の値を表すことができます(各値には複数のレコードが含まれます):{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbb"},{"firstName":"Elliotte","lastName",":”Harold”, “email”: “cccc” } ], “authors”: [ { “firstName”: “Isaac”, “lastName”: “Asimov”, “genre”: “science fiction” }, { “firstName”: “Tad”, “lastName”: “Williams”, “genre”: “fantasy” }, { “firstName”: “Frank”, “lastName”: “Peretti”, “genre”: “christian fiction” } ],「musicians」:[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}}ここで最も注目すべきは、複数の値を表すことができ、各値に複数の値が含まれることです.ただし、レコード内の実際の名前/値のペアは、異なるプライマリ・エントリ(programmers、authors、musicians)の間で異なる場合があります.JSONは完全にダイナミックであり,JSON構造の途中でデータを表す方式を変えることができる.
json解析コードの例
jsonDataは、ネットワークに要求されたjsonデータであり、ネットワーク接続部はここでは与えられていない.
次に、完全なJSONObject解析jsonデータの例を示します.ネットワーク要求部、json解析部を含み、最後に解析したデータをhandlerを使用してtextviewに設定します.
GSON解析
使用時にgsonをバックパックする必要がある.jar
json形式のデータを解析する
GSONは、json形式の文字列が自動的にオブジェクトにマッピングされるので、コードを手動で作成して解析する必要はありません.次のjson形式のデータ:{"name":"Tom","age":20}Personクラスを定義し、nameとageの2つのフィールドを追加し、次のコードを呼び出してjsonデータを自動的にpersonオブジェクトに解析します.
解析json配列
json配列を解析するには、TypeTokenを使用してfromJson()メソッドに解析したいデータ型を転送する必要があります.
データを格納するクラス
1、jsonは軽量レベルのデータ交換フォーマットを定義し、良好な読み取りと迅速な作成が容易な特性を有する.業界の主流テクノロジーは、正規表現に似ており、現在のほとんどの言語でサポートされている完全なソリューションを提供し、異なるプラットフォーム間でデータ交換を行うことができます.JSONは互換性の高いテキスト形式を採用し、C言語体系に類似した行為も備えている.2、表示形式(1)の名称/値の対は最も簡単な形式で、以下のようなJSONで表すことができる」名称/値の対:{"firstName":"Brett"}この例は非常に基本的で、実際には等価な純粋なテキスト"名称/値の対"よりも多くの空間を占有する:firstName=Brettしかし、複数の"名称/値の対"をつなぎ合わせると、JSONはその価値を体現します.まず、{"firstName":"Brett","lastName":"McLaughlin","email":"aaaaa"}など、複数の"名前/値ペア"を含むレコードを作成できます.これは文法的には"名前/値ペア"に比べて大きなメリットはありませんが、この場合JSONの方が使いやすく、読みやすさが向上します.例えば、以上の3つの値が同じレコードの一部であることを明確に示す.カッコはこれらの値に何らかのつながりをもたらします.(2)配列を表す値のセットを表す必要がある場合、JSONは可読性を向上させるだけでなく、複雑さを低減することができる.たとえば、人名リストを表示したいとします.XMLでは、多くの開始タグと終了タグが必要です.通常の名前/値ペア(本シリーズの前の記事で見たような名前/値ペア)を使用する場合は、独自のデータフォーマットを確立するか、キー名をperson 1-firstNameのような形式に変更する必要があります.JSONを使うと、かっこの付いた複数のレコードをグループ化するだけです:{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cc"}]}これは理解に難くない.この例ではpeopleという変数は1つしかありません.値は3つのエントリを含む配列で、各エントリは名前、姓、電子メールアドレスを含む1人のレコードです.上記の例では、記録をカッコで1つの値に組み合わせる方法を示します.もちろん、同じ構文を使用して、複数の値を表すことができます(各値には複数のレコードが含まれます):{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbb"},{"firstName":"Elliotte","lastName",":”Harold”, “email”: “cccc” } ], “authors”: [ { “firstName”: “Isaac”, “lastName”: “Asimov”, “genre”: “science fiction” }, { “firstName”: “Tad”, “lastName”: “Williams”, “genre”: “fantasy” }, { “firstName”: “Frank”, “lastName”: “Peretti”, “genre”: “christian fiction” } ],「musicians」:[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}}ここで最も注目すべきは、複数の値を表すことができ、各値に複数の値が含まれることです.ただし、レコード内の実際の名前/値のペアは、異なるプライマリ・エントリ(programmers、authors、musicians)の間で異なる場合があります.JSONは完全にダイナミックであり,JSON構造の途中でデータを表す方式を変えることができる.
json解析コードの例
// 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();
}
}
jsonDataは、ネットワークに要求されたjsonデータであり、ネットワーク接続部はここでは与えられていない.
private void parseJSONWithJSONObject(String jsonData){
// json
try {
JSONArray jsonArray = new JSONArray(jsonData);
for(int i = 0;i < jsonArray.length();i++){
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
Log.d("MainActivity", "id is" + id);
Log.d("MainActivity", "name is" + name);
Log.d("MainActivity", "version is" + version);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
次に、完全なJSONObject解析jsonデータの例を示します.ネットワーク要求部、json解析部を含み、最後に解析したデータをhandlerを使用してtextviewに設定します.
package com.example.jsontest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.media.Image;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener{
public static final int SHOW_RESPONSE = 0;
private Button mButtonJson;
private TextView mTextView;
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_RESPONSE:
String response = (String) msg.obj;
mTextView.setText(response);
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonJson = (Button) findViewById(R.id.button_json);
mTextView = (TextView) findViewById(R.id.textview);
mButtonJson.setOnClickListener(this);
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
switch (view.getId()) {
case R.id.button_json:
sendRequestWithHttpClient();
break;
default:
break;
}
}
/**
*
*/
private void sendRequestWithHttpClient(){
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://www.weather.com.cn/data/cityinfo/101120101.html");
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = httpResponse.getEntity();
String response = EntityUtils.toString(entity, "utf-8");
parseJSONWithJSONObject(MainActivity.this, response);
}else{
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
/**
* JSONObject
* @param context
* @param jsonData json
*/
private void parseJSONWithJSONObject(Context context,String jsonData){
try {
JSONObject jsonObject = new JSONObject(jsonData);
JSONObject weatherInfo = jsonObject.getJSONObject("weatherinfo");
// JSONObject img1 = weatherInfo.getJSONObject("n0.gif");
String city = weatherInfo.getString("city");
String cityid = weatherInfo.getString("cityid");
String temp1 = weatherInfo.getString("temp1");
String temp2 = weatherInfo.getString("temp2");
String weather = weatherInfo.getString("weather");
String ptime = weatherInfo.getString("ptime");
String data = context.getString(R.string.city)+city+"
"
+context.getString(R.string.cityid)+cityid+"
"
+context.getString(R.string.temp1)+temp1+"
"
+context.getString(R.string.temp2)+temp2+"
"
+context.getString(R.string.weather)+weather+"
"
+context.getString(R.string.ptime)+ptime;
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = data;
handler.sendMessage(message);
Log.d("MainActivity", city);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
GSON解析
使用時にgsonをバックパックする必要がある.jar
json形式のデータを解析する
GSONは、json形式の文字列が自動的にオブジェクトにマッピングされるので、コードを手動で作成して解析する必要はありません.次のjson形式のデータ:{"name":"Tom","age":20}Personクラスを定義し、nameとageの2つのフィールドを追加し、次のコードを呼び出してjsonデータを自動的にpersonオブジェクトに解析します.
Gson gson = new Gson();
Person person = gson.fromJson(jsonData,Person.class);
解析json配列
json配列を解析するには、TypeTokenを使用してfromJson()メソッドに解析したいデータ型を転送する必要があります.
public void parseJSONWithGSON(String jsonData){
Gson gson = new Gson();
List applist = gson.fromJson(jsonData, new TypeToken>().getType());
for(App app : applist){
Log.d("MainActivity","id is"+app.getId());
Log.d("MainActivity","name is"+app.getName());
Log.d("MainActivity","version is"+app.getVersion());
}
}
データを格納するクラス
public void parseJSONWithGSON(String jsonData){
Gson gson = new Gson();
List applist = gson.fromJson(jsonData, new TypeToken>().getType());
for(App app : applist){
Log.d("MainActivity","id is"+app.getId());
Log.d("MainActivity","name is"+app.getName());
Log.d("MainActivity","version is"+app.getVersion());
}
}