JSON 数组是在JSON对象中延伸出来的,多个JSONObject对象就是一个JSONArray,数据之间由逗号分隔,花括号{}保存对象,方括号[]保存数组。
[]一个数组JSONArray,里面可有多个{}元素JSONObject对象,每个元素JSONObject又有若干字段属性("Key":"Value")
JSON数组语法规则
- JSONArray 最外层是“[”和“]”包裹起来的:如
[{"domain":"sojson.com"}]
。 - JSONArray 是由一个或多个 JSONObject 组合起来的:如
[{"domain":"sojson.com"},{"age":"5年"}]
。 - 多个 JSONObject 由逗号分隔。
- JSONArray 取值通过下标或者迭代获取每一个element:如
[{"domain":"sojson.com"},{"age":"5年"}][0].domain
。
上面的[{"domain":"sojson.com"},{"age":"5年"}][0].domain
后面跟着“[0]”就是获取第一个元素(JSONObject),然后取它的name属性。
- var jsonArray = [{"domain":"sojson.com"},{"age":"5年"}];
- alert(jsonArray[0].name);//sojson.com
JSON 数组
JSON 数组在方括号("[]")中书写,数组可包含多个对象,如下“star_male”描述
{
"star_male": [
{
"name": "鹿晗",
"age": "26"
},
{
"nickname": "李易峰",
"age": "29"
},
{
"nickname": "陈赫",
"lastName": "31"
}
]
}
在上面的例子中,对象 "star_male" 是包含三个对象的数组。每个对象代表一条关于一个明星(姓名和年龄)的记录。
使用JSONObject:
解析json数据,官方提供的JSONObject,当然还有开源的GSON、JackSon、FastJSon等等
- 本地Apache服务器中的get_data.json:
- 这里直接用OkHttp请求访问本地Apache服务器中的get_data.json,返回的json数据在parseJsonByJSONObject(responseData);中解析
private void sendRequestWithOKHTTP() {
new Thread(new Runnable() { //新建子线程用于请求
@Override
public void run() {
try {
OkHttpClient client=new OkHttpClient(); //创建OkHttpClient实例
Request request=new Request.Builder() //借助Builder构建Request对象
.url("http://10.0.2.2/get_data.json").build();//指定访问的服务器地址是电脑本地
Response response=client.newCall(request).execute();
//调用OkHttpClient实例的newCall(request)获取Call对象,最后调用call的execute()获取response对象
//服务器返回的数据就在response对象里面
String responseData=response.body().string(); //取出数据
//解析Json数据
parseJsonByJSONObject(responseData);
}catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
- parseJsonByJSONObject(responseData):
private void parseJsonByJSONObject(String jsonData) {
try{
JSONArray jsonArray=new JSONArray(jsonData); //Json数据可理解为数组,一个{}就是有个数组元素,只是里面还有其他属性
/* 遍历json数组,取出每一个元素,而每一个元素都是一个JSONObject对象(又包含各个属性字段) */
for (int i=0;i<jsonArray.length();i++){
JSONObject jsonObject=jsonArray.getJSONObject(i);//取出对应下标的元素,每一个元素属于JSONObject对象
String id=jsonObject.getString("id"); //一个JSONObject对象(又包含各个属性字段)
String name=jsonObject.getString("name");
String version=jsonObject.getString("version");
//输出到控制台
Log.d("MainActivity","id 是:"+id);
Log.d("MainActivity","name 是:"+name);
Log.d("MainActivity","version 是:"+version);
}
}catch (Exception e){
e.printStackTrace();
}
}
① get_data.json中使用[]Json数组JSAONArray,所以先直接把数据放在JSAONArray:JSONArray jsonArray=new JSONArray(jsonData)
② 循环遍历数组JsonArray,取出其中元素(元素类型就是一个JsonObject):JSONObjectjsonObject=jsonArray.getJSONObject(i)
③ 每一个JSONObject对象又有对应键值对("键":"值"),调用:jsonObject.getString("Key"); 即可取出
当然,当json数据jsonData只用{}一个JsonObject对象,直接getString("Key");取出里面对应的值即可