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解析コードの例
//   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());
        }
    }