4.4 JSON解析
原创
©著作权归作者所有:来自51CTO博客作者wx63560c7d74933的原创作品,请联系作者获取转载授权,否则将追究法律责任
使用网络爬虫向服务器发送请求时,服务器经常返回包含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字符串
//省份对象
@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运行结果如下图所示。