使用网络爬虫向服务器发送请求时,服务器经常返回包含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)将字符串解析为JSONObjectJSONArray parseArray(String text)将字符串解析为JSONArrayJSONArray getJSONArray(int index)获取JSONArrayJSONObject getJSONObject(int index)获取JSONObjectString 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运行结果如下图所示。