Android之JSON格式資料解析

來源:互聯網
上載者:User

標籤:android   json   

JSON:JavaScript 物件標記法(JavaScript Object Notation)。獨立於語言和平台,比 XML 更小、更快,更易解析。如今JSON資料已經成為了互連網中大多數資料的傳遞方式,所以必須要熟練掌握。

Android平台內建了JSON解析的相關API,可以將檔案、輸入資料流中的資料轉化為JSON對象,然後從對象中擷取JSON儲存的資料內容。


Android的JSON解析部分都在包org.json下,主要有以下幾個類: 
JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(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實體只能對應建立一個JSON text。。其最大的優點在於可以減少由於格式的錯誤導致程式異常,引用這個類可以自動嚴格按照JSON文法規則(syntax rules)建立JSON text。每個JSONStringer實體只能對應建立一個JSON text。

JSONArray:它代表一組有序的數值。將其轉換為String輸出(toString)所表現的形式是用方括弧包裹,數值以逗號”,”分隔(例如:[value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的瞭解其格式)。這個類的內部同樣具有查詢行為,get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object。

JSONTokener:json解析類
JSONException:json中用到的異常

下面以彙總資料空氣品質城市空氣PM2.5指數資料介面為例來示範JSON格式資料的解析。
彙總資料空氣品質城市空氣PM2.5指數資料介面API文檔參見:http://www.juhe.cn/docs/api/id/33/aid/79
JSON返回樣本:
{ /*JSONObject*/
    "resultcode": "200",
    "reason": "SUCCESSED!",
    "result": [ /*JSONArray*/
        { /*JSONObject*/
            "city": "蘇州",  /*城市*/
            "PM2.5": "73",  /*PM2.5指數*/
            "AQI": "98",    /*空氣品質指數*/
            "quality": "良", /*空氣品質*/
            "PM10": "50",/*PM10*/
            "CO": "0.79",  /*一氧化碳*/
            "NO2": "65",  /*二氧化氮*/
            "O3": "28",    /*臭氧*/
            "SO2": "41",  /*二氧化硫*/
            "time": "2014-12-26 11:48:40"/*更新時間*/  
        }
    ],
    "error_code": 0
}

執行個體:JSONDemo
運行效果:

代碼清單:
布局檔案:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <LinearLayout         android:layout_width="match_parent"        android:layout_height="wrap_content"         android:orientation="horizontal" ><TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_weight="1"    android:gravity="center"    android:text="城市:"    android:textSize="23sp" /><EditText             android:id="@+id/city"            android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="3"            android:inputType="text" />"    </LinearLayout>    <Button        android:id="@+id/query"        android:layout_width="match_parent"        android:layout_height="wrap_content"         android:text="查詢"         android:textSize="23sp" />        <TextViewandroid:id="@+id/result"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

Java原始碼檔案:MainActivity.java
package com.rainsong.jsondemo;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    EditText et_city;    Button btn_query;    TextView tv_result;    QueryTask task;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_city = (EditText)findViewById(R.id.city);        tv_result = (TextView)findViewById(R.id.result);        btn_query = (Button)findViewById(R.id.query);        btn_query.setOnClickListener(new OnClickListener() {            public void onClick(View view) {                String city = et_city.getText().toString();                if (city.length() < 1) {                    Toast.makeText(MainActivity.this, "請輸入城市名",                            Toast.LENGTH_LONG).show();                    return;                }                task = new QueryTask(MainActivity.this, tv_result);                task.execute(city);            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }}

Java原始碼檔案:QueryTask.java
package com.rainsong.jsondemo;import java.io.IOException;import java.net.URLEncoder;import java.util.ArrayList;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.content.Context;import android.os.AsyncTask;import android.widget.TextView;import android.widget.Toast;public class QueryTask extends AsyncTask<String, Void, String> {    Context context;    TextView tv_result;    private static final String JUHE_URL_ENVIRONMENT_AIR_PM =                                     "http://web.juhe.cn:8080/environment/air/pm";    private static final String JUHE_APPKEY = "你申請的APPKEY值";    public QueryTask(Context context, TextView tv_result) {        // TODO Auto-generated constructor stub        super();        this.context = context;        this.tv_result = tv_result;     }    @Override    protected String doInBackground(String... params) {        String city = params[0];        ArrayList<NameValuePair> headerList = new ArrayList<NameValuePair>();        headerList.add(new BasicNameValuePair("Content-Type", "text/html; charset=utf-8"));        String targetUrl = JUHE_URL_ENVIRONMENT_AIR_PM;        ArrayList<NameValuePair> paramList = new ArrayList<NameValuePair>();        paramList.add(new BasicNameValuePair("key", JUHE_APPKEY));        paramList.add(new BasicNameValuePair("dtype", "json"));        paramList.add(new BasicNameValuePair("city", city));        for (int i = 0; i < paramList.size(); i++) {            NameValuePair nowPair = paramList.get(i);            String value = nowPair.getValue();            try {                value = URLEncoder.encode(value, "UTF-8");            } catch (Exception e) {            }            if (i == 0) {                targetUrl += ("?" + nowPair.getName() + "=" + value);            } else {                targetUrl += ("&" + nowPair.getName() + "=" + value);            }        }        HttpGet httpRequest = new HttpGet(targetUrl);        try {            for (int i = 0; i < headerList.size(); i++) {                httpRequest.addHeader(headerList.get(i).getName(),                                        headerList.get(i).getValue());            }            HttpClient httpClient = new DefaultHttpClient();            HttpResponse httpResponse = httpClient.execute(httpRequest);            if (httpResponse.getStatusLine().getStatusCode() == 200) {                String strResult = EntityUtils.toString(httpResponse.getEntity());                return strResult;            } else {                return null;            }        } catch (IOException e) {            e.printStackTrace();        }        return null;    }    @Override      protected void onPostExecute(String result) {        if (result != null) {            try {                JSONObject jsonObject = new JSONObject(result);                int resultCode = jsonObject.getInt("resultcode");                if (resultCode == 200) {                    JSONArray resultJsonArray = jsonObject.getJSONArray("result");                    JSONObject resultJsonObject = resultJsonArray.getJSONObject(0);                    String output = context.getString(R.string.city) + ": " + resultJsonObject.getString("city") + "\n"                            + context.getString(R.string.PM25) + ": " + resultJsonObject.getString("PM2.5") + "\n"                            + context.getString(R.string.AQI) + ": " + resultJsonObject.getString("AQI") + "\n"                            + context.getString(R.string.quality) + ": " + resultJsonObject.getString("quality") + "\n"                            + context.getString(R.string.PM10) + ": " + resultJsonObject.getString("PM10") + "\n"                            + context.getString(R.string.CO) + ": " + resultJsonObject.getString("CO") + "\n"                            + context.getString(R.string.NO2) + ": " + resultJsonObject.getString("NO2") + "\n"                            + context.getString(R.string.O3) + ": " + resultJsonObject.getString("O3") + "\n"                            + context.getString(R.string.SO2) + ": " + resultJsonObject.getString("SO2") + "\n"                            + context.getString(R.string.time) + ": " + resultJsonObject.getString("time") + "\n";                    tv_result.setText(output);                } else if (resultCode == 202) {                    String reason = jsonObject.getString("reason");                    tv_result.setText(reason);                } else {                    Toast.makeText(context, "查詢失敗",                            Toast.LENGTH_LONG).show();                    tv_result.setText("");                }            } catch (JSONException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        } else {            Toast.makeText(context, "查詢失敗",                                    Toast.LENGTH_LONG).show();            tv_result.setText("");        }    }    }

字串資源:string.xml

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">JSONDemo</string>    <string name="action_settings">Settings</string>    <string name="hello_world">Hello world!</string>    <string name="city">城市</string>    <string name="PM25">PM2.5指數</string>    <string name="AQI">空氣品質指數</string>    <string name="quality">空氣品質</string>    <string name="PM10">PM10</string>    <string name="CO">一氧化碳</string>    <string name="NO2">二氧化氮</string>    <string name="O3">臭氧</string>    <string name="SO2">二氧化硫</string>    <string name="time">更新時間</string>    </resources>


API知識點
public class 
JSONObject
extends Object

org.json.JSONObject

Class Overview
A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here. 

JSONObject(String json) 
Creates a new JSONObject with name/value mappings from the JSON string.
 
Object  get(String name) 
Returns the value mapped by name. 

int  getInt(String name) 
Returns the value mapped by name if it exists and is an int or can be coerced to an int. 

String  getString(String name) 
Returns the value mapped by name if it exists, coercing it if necessary. 

JSONArray  getJSONArray(String name) 
Returns the value mapped by name if it exists and is a JSONArray. 

public class 
JSONArray
extends Object

org.json.JSONArray

Class Overview
A dense indexed sequence of values. Values may be any mix of JSONObjects, other JSONArrays, Strings, Booleans, Integers, Longs, Doubles, null or NULL. Values may not be NaNs, infinities, or of any type not listed here. 

JSONObject  getJSONObject(int index) 

Returns the value at index if it exists and is a JSONObject. 


Android之JSON格式資料解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.