1. Json 的优势
1.1 与 xml 的对比
在实际开发中,数据传输和存储我们通常更推荐使用 Json 数据格式,相比 xml 它有以下几个有点:
- Json 更高效,解析库的使用也更方便
- 不像 XML,Json 省去了很多冗余,整体而言更简洁
- 只有对象和数组两种,内部元素比较少,便于理解
1.2 Json 的元素类型
Json 内部只有对象和数组两种类型,如下是一个 Json 对象的数据样例:
{
"Engineer": {
"skill": "Android",
"language": "Java",
"years": 5
} }
上面简短的 Json 数据对应一个“工程师”对象,里面包含技术、开发语言和工龄。再来看一个工程师对象数组:
{"Engineers": [
{
"skill": "Android",
"language": "Java",
"years": "5"
},
{
"skill": "iOS",
"language": "Object C",
"years": "2"
},
{
"skill": "Server",
"language": "php",
"years": "8"
}]}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
以上 Json 数据就是一个包含 3 个“工程师”的对象数组。
2. Json 库的使用
Android 内部为我们提供了 Json 的解析接口,以下是接口中常用的类:
- JSONObject:(必考)
对应一个 Json 对象,相当于上面例子中的“工程师” - JSONArray:(必考)
对应一个 Json 对象数组,相当于上面例子中的“工程师”数组 - JSONStringer:
Json 文本辅助工具,可以帮助我们快速创建一个 Json String - JSONTokener:
Json 特殊字符解析类 - JSONException:**
Json 异常
其中前两个打上“必考”标识的是重中之重,关于 Json 处理的 90% 问题都需要这两个类的帮忙,后面我们会看到这两个接口的具体用法。
3. Json 解析示例
本节我们来用 Android 原生的 Json 工具对 1.2 小节中的“工程师”数据进行一个解析,主需要用到必考的两个类:JSONArray
和JSONObject
。
3.1 布局文件
布局文件非常简单,主要功能就是做一个解析事件的触发和解析结果的展示即可,如下:
<?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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
3.2 解析逻辑
在实际开发中,解析逻辑通常可以单独提出一个类似 Utils 的工具类,这样可以提供给各方使用。本节放在 MainActivity 中完成,获取 Button 后在onClick()
方法中调用parse()
方法进行 Json 数据解析。最后将解析结果放到 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();
}
}}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
核心解析逻辑都在parse()
方法中,拿到 Json String 之后,首先从中去除“工程师”数组,然后遍历数组一次解析“skill”、“language”、“years”字段,挨个生成好“工程师”对象,然后拼接成结果文本展示到 TextView 上。编译后点击解析,结果如下:
4. 小结
本节学习了另一种数据格式,Json 相比 xml 更加精简,而且可以看到 API 的使用也更加直观方便,所以在网络数据的传输和存储方面会更胜一筹。Andorid 提供了一套 Json 数据的解析工具,里面最核心的两个类就是JSONArray
和JSONObject
,这两个是一定要掌握的。最后通过一个例子解析了一个对象,里面包含一个“工程师”数组,然后通过遍历数据即可得到各个“工程师”对象了。当然,除了 Android 内置的 Json 工具之外,还有很多第三方的解析工具,功能非常强大,但只要理解了 Json 数据格式的使用,各大框架也只是一个轮子的使用而已,大同小异。