JSON即JavaScript Object Natation(JavaScript 对象表示法), 它是一种轻量级的数据交换格式,类似于XML但比XML更小、更快,更易解析, 由于它的小巧所以网络传输数据将减少更多流量从而加快速度, 是广泛被采用的客户端和服务端交互的解决方案,比如现在很多开放的API我们可以直接发送一个Get请求就可以获取到返回的数据都是服务器封装好的JSON格式的数据,所以我们需要掌握怎样从这些数据中获取到我们想要的数据。
比如我们需要根据ip地址来获取该ip的具体的一些信息(比如运营商、归属地)等可以通过一些公开的API的方式发生一个GET请求就可以获取,比如可以通过阿里提供的API:
如下是获取ip 220.181.57.217 http://ip.taobao.com/service/getIpInfo.php?ip=220.181.57.217
返回的信息的情况:
可以看出返回的是一个JSON格式的数据。
JSON分为JSON Object(JSON对象)以及JSON Array(JSON数组),下面分别了解下它们的特点:
JSON Object数据的特点:
1.以”{“开始, 以”}”结束
2.对象中的每一个item都是一个key-value对, 表现为”key:value”的形式, key-value对之间使用逗号分隔. 如
{
"name": "geek",
"age"=25,
"address": {
"city": "shanghai",
"country": "China"
}
}
3.JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象甚至是array数组, 也就是说可以存在嵌套的情况。
JSON Array数据的特点:
1.以”[“开始, 以”]”结束
2.数组中的每一个元素可以是string, number, false, true, null, Object对象甚至是array数组
3.数组间的元素使用逗号分隔,如
[
"dxy",
25,
{
"city": "shanghai",
"country": "China" }
]
解析JSON数据, 首先需要明确待解析的是JSON Object还是JSON array, 然后需要确定采用哪种解析技术。 android平台上一般有2种解析技术可供选择: android内置的JSONObject(需要引入org.json包)和google的开源gson库,一下主要讲解使用android内置的JSONObject(需要引入org.json包),更多方法使用的情况可以参考:JSON的三种解析方式
我们先将下面的一段数据封装成JSON Object。
{
"phone" : ["123456789", "987654321"], // 数组
"name": "geek", // 字符串
"age"=25, //数值
"address": {"city": "shanghai","country": "China"} //Object对象
"married" : false // 布尔值
}
下面直接给出MainActivity中的代码:
package com.example.androidstudyjson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class JsonObject extends Activity {
private TextView textview;
private Button button;
JSONObject person;
JSONArray phone;
JSONObject address;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jsonobject);
textview = (TextView) findViewById(R.id.tv);
button = (Button) findViewById(R.id.bt);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
toJson();
//将第一个电话号码转换为数值和将名字转换为数值
phone.getLong(0);
//获取city的值
address.get("city");
textview.setText(phone.getLong(0)+""+address.get("city"));
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
//将数据封装成JSON格式
public void toJson() throws Exception{
//首先最外层是{},是创建一个对象
person = new JSONObject();
//第一个键phone的值是数组,所以需要创建数组对象
phone = new JSONArray();
phone.put("123456789").put("987654321");
person.put("phone", phone);
person.put("name", "geek");
person.put("age", 25);
//address的值是对象,所以又要创建一个对象
address = new JSONObject();
address.put("city", "shanghai").put("country", "China");
person.put("address", address);
person.put("married", false);
}
}