下面将以一个例子来讲解如何使用 JSONObject 去解析JSON
第一步:准备工作
这里我用的是一个百度地图定位的链接,打开就可以看到这次要解析的JSON了ps:地址后面的 ak 可以直接用,如果失效的话可以去百度地图开放平台申请一个
如果觉得乱,推荐用这个网站整好看些
JSON在线工具:http://www.sojson.com/
第二步:明确要获取的数据的父子关系
假如我们要获取的是下图划红线部分的文字,下面文章出现的键名表示要获取的数据的标签名,如addr;
其中蓝色部分的“result”和“pois”表示父级关系
第三步:代码实现
package com.example.administrator.httpdemo.HttpURLConnectionFile;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import com.example.administrator.httpdemo.R;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里用百度地图的一个api来做例子(地址后面的ak可以直接用,如果失效的话可以去申请一个)
sendReques("http://api.map.baidu.com/geocoder/v2/?location=39.934,116.329" +
"&output=json&pois=1&ak=4hWL4Pn8THzPoCGSlS10GNdexou9cZif");
}
/* 我这里是用HttpURLConnection来发送请求,获取json数据
你也可以直接把json转成String类型再来解析
这里就不细讲得到json的过程
*/
private void sendReques(final String strURL) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(strURL);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(2000);
connection.setReadTimeout(5000);
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
//开始解析 (传入String类型的json)
pareJSONwithJSONObject(sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
//解析方法
private void pareJSONwithJSONObject(String jsonData) {
try {
//将服务器返回的数据传入到JSONObject对象中
JSONObject object = new JSONObject(jsonData);
//将object中的 result{} 作为一个对象传入到 object2 中
JSONObject object2 = object.getJSONObject("result");
//由于(划蓝线部分)pois[]它是一个数组的形式,
//我们需要调用getJSONArray()方法并传给 JSONArray
JSONArray jsonArray = object2.getJSONArray("pois");
//遍历数组
for (int i = 0; i < jsonArray.length(); i++) {
//通过角标获取"数组"的对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
//通过调用getString("划红线部分的键名")方法获取想要的数据
String str_addr = jsonObject.getString("addr");
//打开Logcat,查看是是否得到想要获取的数据
Log.d("logcity", str_addr);
}
} catch (Exception e) {
}
}
}
概括:
一般情况下,如果你想获取的数据不包含在数组中,只要一直嵌套,最后调用getString()方法获取就行了,代码如下:
/*假如只嵌套了两层*/
JSONObject object = new JSONObject("json数据源");
JSONObject object2 = object.getJSONObject("键名的父级的父级");
JSONObject object3 = object2.getJSONObject("键名的父级");
String string = jsonObject3.getString("键名");
如果想获取的数据包含在数组中,可以先遍历再取值;
步骤:遍历数组—>调用getJSONObject(index)方法—>再调用getString("键名")方法即可;
其中,index表示角标。代码如下:
JSONObject jsonObject = jsonArray.getJSONObject(index);
String string = jsonObject.getString("键名");