
文章目录json介绍json语法fastjson介绍将json格式的字符串转成json数组json对象的数组将json格式的字符串转成json对象JSON字符串解析的小结将对象转成json格式的字符串将对象集合转成json格式的字符串参考资料json介绍json是一种数据结构任何东西都可以使用json格式的数据来表示。json格式的天气预报数据如下{ time: 2019-05-16 11:17:51, cityInfo: { city: 上海市, cityId: 101020100, parent: 上海, updateTime: 10:48 }, date: 20190516, message: Success !, status: 200, data: { shidu: 93%, pm25: 41, pm10: 42, quality: 良, wendu: 19, ganmao: 极少数敏感人群应减少户外活动, yesterday: { date: 15, sunrise: 05:00, high: 高温 22.0℃, low: 低温 18.0℃, sunset: 18:42, aqi: 35, ymd: 2019-05-15, week: 星期三, fx: 东南风, fl: 3级, type: 小雨, notice: 雨虽小注意保暖别感冒 }, forecast: [ { date: 16, sunrise: 04:59, high: 高温 24.0℃, low: 低温 19.0℃, sunset: 18:43, aqi: 50, ymd: 2019-05-16, week: 星期四, fx: 东风, fl: 3-4级, type: 小雨, notice: 雨虽小注意保暖别感冒 }, { date: 17, sunrise: 04:58, high: 高温 26.0℃, low: 低温 20.0℃, sunset: 18:43, aqi: 48, ymd: 2019-05-17, week: 星期五, fx: 东南风, fl: 3-4级, type: 小雨, notice: 雨虽小注意保暖别感冒 }, { date: 18, sunrise: 04:58, high: 高温 27.0℃, low: 低温 18.0℃, sunset: 18:44, aqi: 72, ymd: 2019-05-18, week: 星期六, fx: 西北风, fl: 3-4级, type: 多云, notice: 阴晴之间谨防紫外线侵扰 }, { date: 19, sunrise: 04:57, high: 高温 26.0℃, low: 低温 18.0℃, sunset: 18:45, aqi: 62, ymd: 2019-05-19, week: 星期日, fx: 南风, fl: 3级, type: 小雨, notice: 雨虽小注意保暖别感冒 }, { date: 20, sunrise: 04:57, high: 高温 25.0℃, low: 低温 17.0℃, sunset: 18:45, aqi: 44, ymd: 2019-05-20, week: 星期一, fx: 北风, fl: 4-5级, type: 多云, notice: 阴晴之间谨防紫外线侵扰 }, { date: 21, sunrise: 04:56, high: 高温 26.0℃, low: 低温 18.0℃, sunset: 18:46, aqi: 58, ymd: 2019-05-21, week: 星期二, fx: 南风, fl: 3级, type: 晴, notice: 愿你拥有比阳光明媚的心情 }, { date: 22, sunrise: 04:55, high: 高温 28.0℃, low: 低温 17.0℃, sunset: 18:47, ymd: 2019-05-22, week: 星期三, fx: 南风, fl: 3级, type: 多云, notice: 阴晴之间谨防紫外线侵扰 } ] } }json语法1、表示对象的话使用{开始使用}结束比如{empno:1001,ename:张三,isMale:true,hiredate:1557978889881}2、表示数组的话使用[开始使用]结束比如[{empno:1001,ename:张三,isMale:true},{empno:1002,ename:李四}]3、特殊字符的含义序号特殊字符含义1[表示数组的开始2]表示数组的结束3{表示对象的开始4}表示对象的结束5定义属性名以及用来表示字符串类型的数据6:连接属性名和属性值7,分隔符属性之间使用该符号分隔元素之间使用该符号分隔4、怎么判断是对象还是数组1如果json串是以 { 开始以 } 结束的话则表示对象2如果json串是以 [ 开始以 ] 结束的话则表示数组5、json支持嵌套1对象里面可以嵌套对象比如{empno:1003,ename:王五,dept:{dno:10,dname:研发,loc:上海}}2数组里面可以嵌套对象比如[{empno:1001,ename:张三,isMale:true},{empno:1002,ename:李四}]3对象里面可以嵌套数组{code:200,data:[{empno:1001,ename:张三},{empno:1002,ename:李四}]}fastjson介绍1、什么是fastjson?fastjson是阿里巴巴的开源JSON解析库它可以解析JSON格式的字符串支持将Java Bean序列化为JSON字符串也可以从JSON字符串反序列化到JavaBean。2、fastjson的优点1速度快fastjson相对其他JSON库的特点是快从2011年fastjson发布1.1.x版本之后其性能从未被其他Java实现的JSON库超越。2使用广泛fastjson在阿里巴巴大规模使用在数万台服务器上部署fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。3测试完备fastjson有非常多的testcase在1.2.11版本中testcase超过3321个。每次发布都会进行回归测试保证质量稳定。4使用简单fastjson的API十分简洁。String textJSON.toJSONString(obj);//序列化VO voJSON.parseObject({...},VO.class);//反序列化5功能完备支持泛型支持流处理超大文本支持枚举支持序列化和反序列化扩展。将json格式的字符串转成json数组json对象的数组json串内容的格式如下[ { _id: 1, id: 1, pid: 0, city_code: 101010100, city_name: 北京 }, { _id: 2, id: 2, pid: 0, city_code: , city_name: 安徽 }, { _id: 3, id: 3, pid: 0, city_code: , city_name: 福建 }, { _id: 4, id: 4, pid: 0, city_code: , city_name: 甘肃 }, { _id: 5, id: 5, pid: 0, city_code: , city_name: 广东 }, { _id: 7, id: 7, pid: 0, city_code: , city_name: 贵州 }, { _id: 15, id: 15, pid: 0, city_code: , city_name: 江苏 }, { _id: 24, id: 24, pid: 0, city_code: 101020100, city_name: 上海 }, { _id: 25, id: 25, pid: 0, city_code: , city_name: 四川 }, { _id: 26, id: 26, pid: 0, city_code: 101030100, city_name: 天津 } ]代码如下packageday03;importorg.apache.http.HttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;importcom.alibaba.fastjson.*;publicclassCityJsonTest{publicstaticvoidmain(String[]args)throwsException{// 创建一个可关闭的客户端工具CloseableHttpClient clientHttpClients.createDefault();// 创建一个GET请求HttpGet requestnewHttpGet(http://cdn.sojson.com/_city.json);// 发送该请求HttpResponse responseclient.execute(request);// 将响应正文body转换字符串String dataEntityUtils.toString(response.getEntity());// 将data解析为JSON数组JSONArray citiesJSON.parseArray(data);//for(Object city:cities){JSONObject obj(JSONObject)city;//if(obj.get(city_name).equals(上海)){System.out.println(obj.get(city_code));//101020100break;}}client.close();//关闭给客户端}}将json格式的字符串转成json对象天气预报json数据的解析思路1将整个json串解析为JSON对象JSONObject objJSON.parseObject(str2);2通过属性名获取属性的内容JSONObject dataobj.getJSONObject(data);3如果解析出来的内容是对象的话可进一步通过属性名获取里面的内容JSONArray forecastdata.getJSONArray(forecast);4如果解析出来的内容是数组的话可进一步通过下标获取里面的内容JSONObject tomorrow(JSONObject)forecast.get(1);代码如下packageday03;importorg.apache.http.HttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;publicclassWeatherJsonTest{publicstaticvoidmain(String[]args)throwsException{//String cityCodenull;// 创建一个可关闭的客户端工具CloseableHttpClient clientHttpClients.createDefault();// 创建一个GET请求HttpGet requestnewHttpGet(http://cdn.sojson.com/_city.json);// 发送该请求HttpResponse responseclient.execute(request);// 将响应正文body转换字符串String strEntityUtils.toString(response.getEntity());// 将str解析为JSON数组JSONArray citiesJSON.parseArray(str);//for(Object city:cities){JSONObject obj(JSONObject)city;//if(obj.get(city_name).equals(上海)){//System.out.println(obj.get(city_code));//101020100cityCodeobj.getString(city_code);break;}}//创建一个请求天气的Get请求HttpGet request2newHttpGet(http://t.weather.sojson.com/api/weather/city/cityCode);//发送该请求HttpResponse response2client.execute(request2);// 将响应正文body转换字符串String str2EntityUtils.toString(response2.getEntity());//将str2解析为JSON对象JSONObject objJSON.parseObject(str2);//获取data属性的内容JSONObject dataobj.getJSONObject(data);//获取forecast属性的内容JSONArray forecastdata.getJSONArray(forecast);//获取明天的天气JSONObject tomorrow(JSONObject)forecast.get(1);System.out.println(tomorrow.get(type));//小雨System.out.println(tomorrow.getString(high));//高温 26.0℃System.out.println(tomorrow.getString(low));//低温 20.0℃client.close();//关闭给客户端}}JSON字符串解析的小结1将表示对象的json串解析为对象使用parseObject(str)2将表示数组的json串解析为数组使用parseArray(str)3属性的值是对象的话就使用getJSONObject获取属性的内容4属性的值是数组的话就使用getJSONArray获取该属性的内容5属性的值是字符串的话就使用get或者getString获取该属性的内容6属性的值是数值的话就使用get获取该属性的内容7属性的值是布尔值的话就使用get获取该属性的内容将对象转成json格式的字符串代码如下packageday03;importjava.util.Date;importcom.alibaba.fastjson.JSON;importcom.testin.model.Dept;importcom.testin.model.Employee;publicclassObjectToJSONTest{publicstaticvoidmain(String[]args){Dept deptnewDept(10,研发,上海);Employee empnewEmployee(1001,张三,true,newDate(),dept);//将部门对象转成json格式的字符串System.out.println(JSON.toJSONString(dept));//System.out.println(JSON.toJSONString(emp));}}运行结果如下{dname:研发,dno:10,loc:上海} {dept:{dname:研发,dno:10,loc:上海},empno:1001,ename:张三,hiredate:1557978889881,male:true}员工模板的代码如下packagecom.testin.model;importjava.util.Date;publicclassEmployee{privateintempno;privateString ename;privatebooleanisMale;privateDate hiredate;privateDept dept;publicEmployee(intempno,String ename,booleanisMale,Date hiredate,Dept dept){super();this.empnoempno;this.enameename;this.isMaleisMale;this.hiredatehiredate;this.deptdept;}publicintgetEmpno(){returnempno;}publicvoidsetEmpno(intempno){this.empnoempno;}publicStringgetEname(){returnename;}publicvoidsetEname(String ename){this.enameename;}publicbooleanisMale(){returnisMale;}publicvoidsetMale(booleanisMale){this.isMaleisMale;}publicDategetHiredate(){returnhiredate;}publicvoidsetHiredate(Date hiredate){this.hiredatehiredate;}publicDeptgetDept(){returndept;}publicvoidsetDept(Dept dept){this.deptdept;}}部门模板的代码如下packagecom.testin.model;publicclassDept{privateintdno;privateString dname;privateString loc;publicDept(intdno,String dname,String loc){super();this.dnodno;this.dnamedname;this.locloc;}publicintgetDno(){returndno;}publicvoidsetDno(intdno){this.dnodno;}publicStringgetDname(){returndname;}publicvoidsetDname(String dname){this.dnamedname;}publicStringgetLoc(){returnloc;}publicvoidsetLoc(String loc){this.locloc;}}将对象集合转成json格式的字符串代码如下packageday03;importjava.util.ArrayList;importjava.util.List;importcom.alibaba.fastjson.JSON;importcom.testin.model.Dept;publicclassListToJSONTest{publicstaticvoidmain(String[]args){// TODO Auto-generated method stubListDeptdeptsnewArrayListDept();Dept d1newDept(10,研发,上海);Dept d2newDept(20,销售,上海);depts.add(d1);depts.add(d2);System.out.println(JSON.toJSONString(depts));}}运行结果如下[{dname:研发,dno:10,loc:上海},{dname:销售,dno:20,loc:上海}]参考资料[1] json语法https://www.runoob.com/json/json-syntax.html[2] JSON最佳实践http://kimmking.github.io/2017/06/06/json-best-practice/[3] fastjson教程https://www.w3cschool.cn/fastjson[4] Json详解以及fastjson使用教程https://blog.csdn.net/srj1095530512/article/details/82529759[5] fastjson新手指南https://github.com/alibaba/fastjson/wiki/Quick-Start-CN[6] 天气预报接口API文档https://www.juhe.cn/docs/api/id/73[7] 免费天气API天气JSON API不限次数获取十五天的天气预报https://www.sojson.com/blog/305.html微信扫一扫关注公众号点击链接加入群聊https://jq.qq.com/?_wv1027k5eVEhfN软件测试学习交流QQ群号511619105