使用网络爬虫向服务器发送请求时,服务器经常返回包含JSON字符串的数据,此时需要对服务器返回的JSON字符串进行解析。目前,主流的JSON解析框架有org.json、Gson以及阿里巴巴开源的Fastjson,本节以Fastjson为例演示如何解析JSON字符串。

1.引入依赖
Fastjson是阿里巴巴公司基于Java语言开发的高性能且完善的JSON操作类库。使用前,在Maven工程的pom.xml文件中配置所需要的dependency。

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>

2.常用方法

方法

说明

JSONObject parseObject(String text)

将字符串解析为JSONObject

JSONArray parseArray(String text)

将字符串解析为JSONArray

JSONArray getJSONArray(int index)

获取JSONArray

JSONObject getJSONObject(int index)

获取JSONObject

String getString(int index)

获取键值

3.使用Fastjson解析结构如下图所示的json字符串

4.4 JSON解析_json

//省份对象
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Province {
private String name;

private String capital;

private String abbreviation;

private List<String> cityList;
}
//程序4-5
public class JsonParse {
public static void main(String[] args) {
String str = "[{\n" +
"\t\t\"名称\": \"江苏省\",\n" +
"\t\t\"省会\": \"南京\",\n" +
"\t\t\"简称\": \"苏\",\n" +
"\t\t\"辖市\": [\"南京\", \"无锡\", \"徐州\", \"常州\"]\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"名称\": \"浙江省\",\n" +
"\t\t\"省会\": \"杭州\",\n" +
"\t\t\"简称\": \"浙\",\n" +
"\t\t\"辖市\": [\"杭州\", \"温州\", \"嘉兴\", \"绍兴\"]\n" +
"\t},\n" +
"\t{\n" +
"\t\t\"名称\": \"安徽省\",\n" +
"\t\t\"省会\": \"合肥\",\n" +
"\t\t\"简称\": \"皖\",\n" +
"\t\t\"辖市\": [\"合肥\", \"马鞍山\", \"滁州\", \"芜湖\"]\n" +
"\t}\n" +
"]";
JSONArray jsonArray = JSONArray.parseArray(str);
if(jsonArray != null && jsonArray.size() > 0){
List<Province> provinceList = new ArrayList<>();
for(int i = 0;i < jsonArray.size();i++){
Province province = new Province();

JSONObject jsonObject = jsonArray.getJSONObject(i);
province.setName(jsonObject.getString("名称"));
province.setAbbreviation(jsonObject.getString("省会"));
province.setCapital(jsonObject.getString("简称"));

JSONArray cityJsonArray = jsonObject.getJSONArray("辖市");
List<String> cityList = new ArrayList<>();
if(cityJsonArray != null && cityJsonArray.size() > 0) {

for(int j = 0;j < cityJsonArray.size();j++){
cityList.add(cityJsonArray.getString(j));
}
}
province.setCityList(cityList);

provinceList.add(province);
}
for(int k = 0;k < provinceList.size();k++){
System.out.println(provinceList.get(k));
}
}
}
}

程序4-5运行结果如下图所示。

4.4 JSON解析_字符串_02