基础能力 —— JSON

发布于 2021-04-01  687 次阅读


一、什么是JSON?

JSON:JavaScript Object Notation[JavaScript 对象表示法]

JSON 是存储和交换文本信息的语法。类似 XML。(什么是XML?XML 简介 – 什么是 XML? | 菜鸟教程 (runoob.com)

JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言


二、为什么需要JSON

https://zhuanlan.zhihu.com/p/33792109


三、JSON、JSON格式、JSON对象、JSON字符串是什么关系?(重点)

1.JSON

其实,JSON并不复杂,之所以新手会对JSON犯迷糊,原因是简称。(至少我是这个原因)无论是在工作中,还是在论坛上,绝大多数时候,我们把JSON对象和JSON字符串都简称为JSON,以至于你常常会听到这样的回答:

"这个响应你用JSON接收就行"

"你测试接口的时候要记得用JSON格式"

"把这个JSON解析一下"

...

久而久之,新手就把JSON格式、JSON字符串、JSON对象(又可分普通对象、JSON数组)三者搞混了,现在,我们就将它们的关系梳理清楚。

2.JSON格式

JSON格式是一种数据交互的格式

当客户端和服务端进行数据交互的时候(不仅是C/S模型,其他模型也可以使用JSON格式交互),需要定义数据格式,JSON格式就是其中一种。

JSON格式是从JavaScript演变而来的

JSON是从 JavaScript 脚本语言中演变而来,使用Javascript语法来描述数据对象,文件名扩展是 .json,但是JSON格式仅仅是一个文本,仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON

JavaScript对象的定义语法如下:

var person = {firstName:"Bill",
              lastName:"Gates", 
              age:62, 
              eyeColor:"blue"};
而JSON格式则长这样:
{
    "book": [
        {
            "id":"01",
            "language": "Java",
            "edition": "third",
            "author": "Herbert Schildt"
        },
        {
            "id":"07",
            "language": "C++",
            "edition": "second"
            "author": "E.Balagurusamy"
    }]
}

 JSON格式和JavaScript的区别

 二者之间的详细总结可以参考下述文章:JavaScript JSON的总结 - 知乎 (zhihu.com)

3.JSON字符串

首先,请清晰一点,JSON字符串本质上就是字符串。

String url = "https://restapi.amap.com/v3/config/district?output=JSON&key=75bf29a927a4ce42358665b507493393&extensions=base" + "&" + "keywords=" + keywords;
String result = HttpUtil.get(url);
上述代码是高德查询省市区的接口,返回值如下:诺,我们一眼就能发现,这不就是JSON格式的数据吗,我们直接用字符串类型的result去接收,一点问题都没有。
其实用什么类型去接收返回值,是由方法决定的
如果方法返回的是一个JSONObject类型,那你直接使用JSONObject去接收
如果方法返回的是一个JSON格式的字符串,那你直接使用String去接收,然后再把这个String类型转换成JSONObject类型或者JSONArray即可
那么,我们为什么要把String类型转成JSONObject或者JSONArray呢?

4.JSON对象(JSONObject、JSONArray)

为什么要把String类型转成转成JSONObject或者JSONArray,其实是业务决定的。你想想,如果我们需要通过高德接口查询某一个省下面的市信息,那么如果返回值是String类型的话,我们单单想获取市名称列表,即List<name>,需要对字符串进行截断,拼接等等一系列的麻烦操作,这个过程还极其容易出错。所以,我们直接使用JSONObject类型,其本质是k-v结构


四、JSON字符串和JSONObject对象的相互转换

我们可以使用FastJson 的JSONObject.parseObject(jsonStr)将JSON字符串转换为JSONObject对象,之后可以直接通过get(key)获取对应的属性值

JSONObject parse = JSONObject.parseObject(result);
//通过key取JSONArray
JSONArray puisneList = parse.getJSONArray("districts");
//通过key取JSONObject
JSONObject name = parse.get("jsonObject");
//通过key取属性值
String name = parse.get("name");

四、JSON字符串和Java对象的相互转换

JSON字符串转Java对象:JSON.parseObject(jsonStr, Target.class)

Java对象转JSON字符串:JSON.toJSONString(TargetObject)


五、JSONObject和Java对象的相互转换

Java对象--->JSON对象

Student stu = new Student("公众号BiggerBoy", "m", 2);
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(stu);

JSON对象--->Java对象

Student stu = new Student("公众号BiggerBoy", "m", 2);
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(stu);
Student student = JSONObject.toJavaObject(jsonObject, Student.class);

JSON字符串--->Java对象

ReportExceptionDto frontReportExceptionDto = JSONObject.parseObject(jsonObject.toJSONString(), ReportExceptionDto.class);

注意区别:toJavaObject和parseObject两个方法都可以将jsonObject转换为Java对象,
但是toJavaObjec没有处理json转换对象$ref关键词,而parseObject方法处理了!

toJavaObject和parseObject,区别是:

parseObject的第一个参数是json字符串;

toJavaObject的第一个参数是json对象;

参照:JSONObject.toJavaObject的使用以及其他方法的使用JSON与Java对象的转换_sucsmanw的博客-CSDN博客_jsonobject to object
      Fastjson-JSON.toJavaObject(String text, Class<T>)与JSONObject.toJavaObject(JSON json, Class<T> clazz)_hanjq_code的博客-CSDN博客_fastjson tojavaobject


五、JSON字符串和JavaScript对象的相互转换

JSON和JS对象的相互转换 (biancheng.net)

 JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,所以 JSON 本质是一个字符串。通过 JSON 调用相应的方法,JSON 和 JS 对象可以相互转换。

将JSON字符串转换为JS对象

通过 JSON字符串的 parse() 方法,可以将一个 JSON字符串 解析为一个JS对象,解析格式如下:JSON.parse(json)【JSON ---> JS对象】

例如:

var json = '{"name":"张三", "age":36}';//定义一个JSON
var obj = JSON.parse(json);//调用parse()将json解析为一个JS对象
console.log(obj);//输出:{name: "张三", age: 36}

将JS对象转换为JSON字符串

通过 JSON 的 stringify() 方法,可以将一个 JS 对象转换为 JSON,转换格式如下:JSON.stringify(obj)【JS对象--->JSON字符串】

例如:

var obj = {name:"张三", age:36};//定义一个JS对象
var json = JSON.stringify(obj);//调用stringify()将一个JS对象转换为JSON
console.log(json);//输出:{"name":"张三","age":36}


她喜欢所以就做咯