JSONObject是Android官方提供用来解析JSON数据的API。
要解析JSON数据,首先我们得要有一个放有JSON数据的服务器地址,这里我自己配置了一个Web服务器,并且将JSON数据放在了上面。在浏览器输入JSON数据的服务器地址,出现的内容如下所示:
从上图,我们可以看到,http://192.168.43.8/get_data.json 这个地址是JSON数据的服务器地址,当然这个是我自己配置的,其中192.168.43.8是我本机的ip地址,而get_data.json是Web服务器根目录下的一个文件。这些都不重要,重要的是,你要拿到一个JSON数据的服务器地址,只要拿到这个地址了,我们就可以解析了。
好了,现在JSON数据的服务器地址我们已经拿到了,现在我们来做解析的准备工作,因为要解析JSON数据,肯定是要发送HTTP请求的,然后对返回的数据进行解析,如果你对发送HTTP请求和获取返回的数据还不熟悉,请看我的另外两篇博客:
使用OkHttp发送HTTP请求并显示返回的数据
使用HttpURLConnection发送HTTP请求并显示请求到的数据
这两篇博客都可以实现发送HTTP的请求并获取返回的数据。
我下面的源码是以使用OkHttp发送HTTP请求为基础写的。
当然,别忘记加网络权限,在AndroidManifest.xml中加入以下代码:
<uses-permission android:name="android.permission.INTERNET" />
现在我们来看看源码:
MainActivity的xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<Button android:id="@+id/btn_send_request" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="发送请求" android:textSize="20sp" />
</LinearLayout>
布局代码就是一个按钮,因为我们这里演示的就是点击按钮发送HTTP请求,然后将返回的JSON数据进行解析在打印日志显示出来。
MainActivity的java代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtn_sendRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn_sendRequest = findViewById(R.id.btn_send_request);
mBtn_sendRequest.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_send_request) {
// 发送网络请求并读取的方法
sendRequestWithOkHttp();
}
}
private void sendRequestWithOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建一个OkHttpClient的实例
OkHttpClient client = new OkHttpClient();
// 如果要发送一条HTTP请求,就需要创建一个Request对象
// 可在最终的build()方法之前连缀很多其他方法来丰富这个Request对象
Request request = new Request.Builder()
//此处的url应为json数据的服务器地址
.url("http://192.168.43.8/get_data.json")
.build();
// 调用OkHttpClient的newCall()方法来创建一个Call对象,并调用execute()方法来发送请求并获取服务器的返回数据
Response response = client.newCall(request).execute();
// 其中Response对象就是服务器返回的数据,将数据转换成字符串
String jsonData = response.body().string();
// 将JSON数据传入parseJSON()函数
parseJSON(jsonData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void parseJSON(String jsonData) {
try {
JSONArray jsonArray = new JSONArray(jsonData);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String id = jsonObject.getString("id");
String name = jsonObject.getString("name");
String version = jsonObject.getString("version");
//打印日志
Log.d("MainActivity", id);
Log.d("MainActivity", name);
Log.d("MainActivity", version);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
这里我们主要看解析JSON数据那一部分,也就是获取服务器数据之后调用的parseJSON()方法,在这个方法中,首先我们把获取的服务器数据传了进来,由于我们服务器中定义的是一个JSON数组,因此这里首先是将服务器返回的数据传入到了一个JSONArray对象中。然后遍历这个JSONArray,从中取出的每一个元素都是一个JSONObject对象,每个JSONObject对象中又会包含id、name、version这些数据。接下来只需要调用getString()方法将这些数据取出,并打印出来就可以了。
最终日志效果图如下: