json语法和json解析

json介绍

json是一种数据结构,任何东西都可以使用json格式的数据来表示。
image.png
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 text = JSON.toJSONString(obj); //序列化
VO vo = JSON.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": "天津"
  }
]

代码如下:

package day03;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.*;
public class CityJsonTest {
 public static void main(String[] args) throws Exception{
  // 创建一个可关闭的客户端工具
  CloseableHttpClient client = HttpClients.createDefault();
  // 创建一个GET请求
  HttpGet request = new HttpGet("http://cdn.sojson.com/_city.json");
  // 发送该请求
  HttpResponse response = client.execute(request);
  // 将响应正文(body)转换字符串
  String data = EntityUtils.toString(response.getEntity());
  // 将data解析为JSON数组
  JSONArray cities = JSON.parseArray(data);
  //
  for(Object city:cities){
   JSONObject obj = (JSONObject)city;
   //
   if(obj.get("city_name").equals("上海")){
    System.out.println(obj.get("city_code"));//101020100
    break;
   }
  }
  client.close();//关闭给客户端
 }
}

将json格式的字符串转成json对象

天气预报json数据的解析思路:
1)将整个json串解析为JSON对象

JSONObject obj= JSON.parseObject(str2);

2)通过属性名获取属性的内容

JSONObject data = obj.getJSONObject("data");

3)如果解析出来的内容是对象的话,可进一步通过属性名获取里面的内容

JSONArray forecast = data.getJSONArray("forecast"); 

4)如果解析出来的内容是数组的话,可进一步通过下标获取里面的内容

JSONObject tomorrow = (JSONObject)forecast.get(1);

代码如下:

package day03;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class WeatherJsonTest {
 public static void main(String[] args) throws Exception {
  //
  String cityCode = null;
  // 创建一个可关闭的客户端工具
  CloseableHttpClient client = HttpClients.createDefault();
  // 创建一个GET请求
  HttpGet request = new HttpGet("http://cdn.sojson.com/_city.json");
  // 发送该请求
  HttpResponse response = client.execute(request);
  // 将响应正文(body)转换字符串
  String str = EntityUtils.toString(response.getEntity());
  // 将str解析为JSON数组
  JSONArray cities = JSON.parseArray(str);
  //
  for(Object city:cities){
   JSONObject obj = (JSONObject)city;
   //
   if(obj.get("city_name").equals("上海")){
    //System.out.println(obj.get("city_code"));//101020100
    cityCode = obj.getString("city_code");
    break;
   }
  }
  //创建一个请求天气的Get请求
  HttpGet request2 = new HttpGet("http://t.weather.sojson.com/api/weather/city/"+cityCode);
  //发送该请求
  HttpResponse response2 = client.execute(request2);
  // 将响应正文(body)转换字符串
  String str2 = EntityUtils.toString(response2.getEntity());
  //将str2解析为JSON对象
  JSONObject obj= JSON.parseObject(str2);
  //获取data属性的内容
  JSONObject data = obj.getJSONObject("data");
  //获取forecast属性的内容
  JSONArray forecast = data.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格式的字符串

代码如下:

package day03;
import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.testin.model.Dept;
import com.testin.model.Employee;
public class ObjectToJSONTest {
 public static void main(String[] args) {
  Dept dept = new Dept(10,"研发","上海");
  Employee emp = new Employee(1001,"张三",true,new Date(),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}

员工模板的代码如下:

package com.testin.model;
import java.util.Date;
public class Employee {
 private int empno;
 private String ename;
 private boolean isMale;
 private Date hiredate;
 private Dept dept; 
 public Employee(int empno, String ename, boolean isMale, Date hiredate, Dept dept) {
  super();
  this.empno = empno;
  this.ename = ename;
  this.isMale = isMale;
  this.hiredate = hiredate;
  this.dept = dept;
 }
 public int getEmpno() {
  return empno;
 }
 public void setEmpno(int empno) {
  this.empno = empno;
 }
 public String getEname() {
  return ename;
 }
 public void setEname(String ename) {
  this.ename = ename;
 }
 public boolean isMale() {
  return isMale;
 }
 public void setMale(boolean isMale) {
  this.isMale = isMale;
 }
 public Date getHiredate() {
  return hiredate;
 }
 public void setHiredate(Date hiredate) {
  this.hiredate = hiredate;
 }
 public Dept getDept() {
  return dept;
 }
 public void setDept(Dept dept) {
  this.dept = dept;
 } 
}

部门模板的代码如下:

package com.testin.model;
public class Dept {
 private int dno;
 private String dname;
 private String loc; 
 public Dept(int dno, String dname, String loc) {
  super();
  this.dno = dno;
  this.dname = dname;
  this.loc = loc;
 }
 public int getDno() {
  return dno;
 }
 public void setDno(int dno) {
  this.dno = dno;
 }
 public String getDname() {
  return dname;
 }
 public void setDname(String dname) {
  this.dname = dname;
 }
 public String getLoc() {
  return loc;
 }
 public void setLoc(String loc) {
  this.loc = loc;
 }
}

将对象集合转成json格式的字符串

代码如下:

package day03;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.testin.model.Dept;
public class ListToJSONTest {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  List<Dept> depts = new ArrayList<Dept>();
  Dept d1 = new Dept(10,"研发","上海");
  Dept d2 = new Dept(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

微信扫一扫关注公众号
image.png
点击链接加入群聊

https://jq.qq.com/?_wv=1027&k=5eVEhfN
软件测试学习交流QQ群号:511619105

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值