第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

Android 入門教程

菜單類控件
菜單:Menu
并發(fā)編程
多線程

在上一節(jié)我們學(xué)習(xí)了 xml 數(shù)據(jù)格式,如果你覺得 xml 的數(shù)據(jù)比較冗余,標(biāo)簽、屬性等等定義過于復(fù)雜,那么這一節(jié)我們將繼續(xù)學(xué)習(xí)另一種更精簡(jiǎn)、更高效的數(shù)據(jù)格式—— Json。它廣泛的運(yùn)用于數(shù)據(jù)持久化以及網(wǎng)絡(luò)傳輸中,這一節(jié)我們一起學(xué)習(xí) Json 的特點(diǎn)及其具體用法。

1. Json 的優(yōu)勢(shì)

1.1 與 xml 的對(duì)比

在實(shí)際開發(fā)中,數(shù)據(jù)傳輸和存儲(chǔ)我們通常更推薦使用 Json 數(shù)據(jù)格式,相比 xml 它有以下幾個(gè)有點(diǎn):

  • Json 更高效,解析庫(kù)的使用也更方便
  • 不像 XML,Json 省去了很多冗余,整體而言更簡(jiǎn)潔
  • 只有對(duì)象和數(shù)組兩種,內(nèi)部元素比較少,便于理解

1.2 Json 的元素類型

Json 內(nèi)部只有對(duì)象和數(shù)組兩種類型,如下是一個(gè) Json 對(duì)象的數(shù)據(jù)樣例:

{  
    "Engineer": {  
        "skill":       "Android",   
        "language":      "Java",   
        "years":    5  
    }  
}  

上面簡(jiǎn)短的 Json 數(shù)據(jù)對(duì)應(yīng)一個(gè)“工程師”對(duì)象,里面包含技術(shù)、開發(fā)語(yǔ)言和工齡。再來看一個(gè)工程師對(duì)象數(shù)組:

{
"Engineers": [
    {
        "skill": "Android",
        "language": "Java",
        "years": "5"
    },
    {
        "skill": "iOS",
        "language": "Object C",
        "years": "2"
    },
    {
        "skill": "Server",
        "language": "php",
        "years": "8"
    }]
}

以上 Json 數(shù)據(jù)就是一個(gè)包含 3 個(gè)“工程師”的對(duì)象數(shù)組。

2. Json 庫(kù)的使用

Android 內(nèi)部為我們提供了 Json 的解析接口,以下是接口中常用的類:

  • JSONObject:(必考)
    對(duì)應(yīng)一個(gè) Json 對(duì)象,相當(dāng)于上面例子中的“工程師”
  • JSONArray:(必考)
    對(duì)應(yīng)一個(gè) Json 對(duì)象數(shù)組,相當(dāng)于上面例子中的“工程師”數(shù)組
  • JSONStringer:
    Json 文本輔助工具,可以幫助我們快速創(chuàng)建一個(gè) Json String
  • JSONTokener:
    Json 特殊字符解析類
  • JSONException:**
    Json 異常

其中前兩個(gè)打上“必考”標(biāo)識(shí)的是重中之重,關(guān)于 Json 處理的 90% 問題都需要這兩個(gè)類的幫忙,后面我們會(huì)看到這兩個(gè)接口的具體用法。

3. Json 解析示例

本節(jié)我們來用 Android 原生的 Json 工具對(duì) 1.2 小節(jié)中的“工程師”數(shù)據(jù)進(jìn)行一個(gè)解析,主需要用到必考的兩個(gè)類:JSONArrayJSONObject。

3.1 布局文件

布局文件非常簡(jiǎn)單,主要功能就是做一個(gè)解析事件的觸發(fā)和解析結(jié)果的展示即可,如下:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/json"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="30dp"
        android:layout_marginTop="46dp"
        android:text="Json文本" />

    <Button
        android:id="@+id/parse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/json"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="開始解析" />
</RelativeLayout>

3.2 解析邏輯

在實(shí)際開發(fā)中,解析邏輯通??梢詥为?dú)提出一個(gè)類似 Utils 的工具類,這樣可以提供給各方使用。本節(jié)放在 MainActivity 中完成,獲取 Button 后在onClick()方法中調(diào)用parse()方法進(jìn)行 Json 數(shù)據(jù)解析。最后將解析結(jié)果放到 TextView 上展示:


package com.emercy.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONObject;

public class MainActivity extends Activity {
    public static final String JSON_STRING = "{\"Engineers\":[{\"skill\":\"Android\",\"language\":\"Java\",\"years\":\"5\"},{\"skill\":\"iOS\",\"language\":\"Object C\",\"years\":\"2\"},{\"skill\":\"Server\",\"language\":\"php\",\"years\":\"8\"}]}";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.parse).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                parse(JSON_STRING);
            }
        });
    }

    private void parse(String jsonStr) {
        TextView textView = (TextView) findViewById(R.id.json);
        try {
            JSONObject engineers = new JSONObject(jsonStr);

            JSONArray array = engineers.getJSONArray("Engineers");

            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < array.length(); i++) {
                JSONObject engineer = array.getJSONObject(i);
                String skill = engineer.getString("skill");
                String language = engineer.getString("language");
                int years = engineer.getInt("years");

                stringBuilder.append("Engineer ").append(i)
                        .append(": skill is ").append(skill)
                        .append("; language is ").append(language)
                        .append("; years is ").append(years).append("\n");

            }
            textView.setText(stringBuilder.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

核心解析邏輯都在parse()方法中,拿到 Json String 之后,首先從中去除“工程師”數(shù)組,然后遍歷數(shù)組一次解析“skill”、“l(fā)anguage”、“years”字段,挨個(gè)生成好“工程師”對(duì)象,然后拼接成結(jié)果文本展示到 TextView 上。編譯后點(diǎn)擊解析,結(jié)果如下:

json

4. 小結(jié)

本節(jié)學(xué)習(xí)了另一種數(shù)據(jù)格式,Json 相比 xml 更加精簡(jiǎn),而且可以看到 API 的使用也更加直觀方便,所以在網(wǎng)絡(luò)數(shù)據(jù)的傳輸和存儲(chǔ)方面會(huì)更勝一籌。Andorid 提供了一套 Json 數(shù)據(jù)的解析工具,里面最核心的兩個(gè)類就是JSONArrayJSONObject,這兩個(gè)是一定要掌握的。最后通過一個(gè)例子解析了一個(gè)對(duì)象,里面包含一個(gè)“工程師”數(shù)組,然后通過遍歷數(shù)據(jù)即可得到各個(gè)“工程師”對(duì)象了。當(dāng)然,除了 Android 內(nèi)置的 Json 工具之外,還有很多第三方的解析工具,功能非常強(qiáng)大,但只要理解了 Json 數(shù)據(jù)格式的使用,各大框架也只是一個(gè)輪子的使用而已,大同小異。