什么是JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,由于其简洁的格式和易于解析的特点,已经成为现代Web应用程序中广泛使用的数据交换格式之一。
解析JSON的方法
Java中常用的解析JSON的方法有三种:
1.使用JSON库
目前,Java中最流行的JSON库是 com.alibaba.fastjson.JSON。FastJSON是一个高性能的Java JSON库,其使用简单且性能高效。
// 将json字符串转换为JSONObject对象
JSONObject jsonObject = JSON.parseObject(jsonString);
// 从JSONObject对象中获取某个字段
String name = jsonObject.getString("name");
// 将POJO对象转换为JSONObject对象
JSONObject jsonObject = (JSONObject) JSON.toJSON(pojoObject);
2.使用Java自带的JSON库
Java自带JSON库由JSON.org提供。Java SE 6及以上版本中已经内置了JSON库,可以直接使用。只需在项目中导入 org.json 包,就可以进行JSON的解析和生成。
// 将json字符串转换为JSONObject对象
JSONObject jsonObject = new JSONObject(jsonString);
// 从JSONObject对象中获取某个字段
String name = jsonObject.getString("name");
// 将POJO对象转换为JSONObject对象
JSONObject jsonObject = new JSONObject(pojoObject);
3.手动解析
手动解析JSON是最低级的解析方式,但是可以灵活地处理JSON数据。首先需要将JSON字符串转换为一个数组或对象,然后遍历它们的键,并提取相应的值。
// 将json字符串转换为JSONArray数组
JSONArray jsonArray = new JSONArray(jsonString);
// 遍历JSONArray数组
for (int i = 0; i < jsonArray.length(); i++) {
// 获取每个JSONObject对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 从JSONObject对象中获取某个字段
String name = jsonObject.getString("name");
}
解析复杂的JSON数组
在解析JSON数组时,有些JSON数组是比较复杂的,包含嵌套的JSON对象或JSON数组。我们需要了解一些特殊情况来正确解析这些复杂的JSON数组。
1.解析嵌套的JSON对象
在JSON数组中嵌套JSON对象的时候,需要使用getJSONObject()方法获取对象。
// json字符串
String jsonString = "[{\"name\":\"Jim\",\"age\":18,\"address\":{\"province\":\"Guangdong\",\"city\":\"Shenzhen\"}}, {\"name\":\"Lucy\",\"age\":19,\"address\":{\"province\":\"Guangdong\",\"city\":\"Dongguan\"}}]";
// 将json字符串转换为JSONArray对象
JSONArray jsonArray = JSONArray.parseArray(jsonString);
// 遍历JSONArray数组
for (int i = 0; i < jsonArray.size(); i++) {
// 获取每个JSONObject对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 从JSONObject对象中获取name、age字段和address对象
String name = jsonObject.getString("name");
int age = jsonObject.getInteger("age");
JSONObject addressObject = jsonObject.getJSONObject("address");
// 从address对象中获取province和city字段
String province = addressObject.getString("province");
String city = addressObject.getString("city");
}
2.解析嵌套的JSON数组
在JSON数组中嵌套JSON数组的时候,需要使用getJSONArray()方法获取数组。
// json字符串
String jsonString = "[{\"name\":\"Jim\",\"age\":18,\"friends\":[{\"name\":\"Tom\",\"age\":20},{\"name\":\"Lucy\",\"age\":19}]}, {\"name\":\"Lucy\",\"age\":19,\"friends\":[{\"name\":\"John\",\"age\":22}]}]";
// 将json字符串转换为JSONArray对象
JSONArray jsonArray = JSONArray.parseArray(jsonString);
// 遍历JSONArray数组
for (int i = 0; i < jsonArray.size(); i++) {
// 获取每个JSONObject对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 从JSONObject对象中获取name、age字段和friends数组
String name = jsonObject.getString("name");
int age = jsonObject.getInteger("age");
JSONArray friendsArray = jsonObject.getJSONArray("friends");
// 遍历friends数组
for (int j = 0; j < friendsArray.size(); j++) {
// 获取每个JSONObject对象
JSONObject friendObject = friendsArray.getJSONObject(j);
// 从JSONObject对象中获取name、age字段
String friendName = friendObject.getString("name");
int friendAge = friendObject.getInteger("age");
}
}
3.解析复杂的JSON数组
在处理更复杂的JSON数据时,可以使用递归的方式。
public void parseJson(JSONArray jsonArray) {
// 遍历JSONArray数组
for (int i = 0; i < jsonArray.size(); i++) {
// 获取每个JSONObject对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 从JSONObject对象中获取name、age字段
String name = jsonObject.getString("name");
int age = jsonObject.getInteger("age");
// 递归处理address对象
JSONObject addressObject = jsonObject.getJSONObject("address");
parseAddress(addressObject);
// 递归处理friends数组
JSONArray friendsArray = jsonObject.getJSONArray("friends");
parseFriends(friendsArray);
}
}
public void parseAddress(JSONObject addressObject) {
// 从address对象中获取province和city字段
String province = addressObject.getString("province");
String city = addressObject.getString("city");
// 递归处理street对象
JSONObject streetObject = addressObject.getJSONObject("street");
parseStreet(streetObject);
}
public void parseStreet(JSONObject streetObject) {
// 从street对象中获取name字段
String name = streetObject.getString("name");
}
public void parseFriends(JSONArray friendsArray) {
// 遍历friends数组
for (int i = 0; i < friendsArray.size(); i++) {
// 获取每个JSONObject对象
JSONObject friendObject = friendsArray.getJSONObject(i);
// 从JSONObject对象中获取name、age字段和address对象
String friendName = friendObject.getString("name");
int friendAge = friendObject.getInteger("age");
JSONObject friendAddressObject = friendObject.getJSONObject("address");
// 递归处理friend的address对象
parseAddress(friendAddressObject);
}
}
总结
在Java中解析JSON数组并不困难,有多种解析方式可供选择。对于普通的JSON数组,我们可以直接使用JSON库来解析;对于复杂的JSON数组,我们需要使用适当的解析方法,并注意处理嵌套的JSON对象和JSON数组。