JSON面试知识点全解析:从基础到进阶,面试官常问问题都在这
JSON(JavaScript Object Notation)作为当前前后端数据交互的核心格式,几乎是所有开发岗位的必考知识点,无论是前端面试中的数据解析、接口对接,还是后端面试中的数据传输、序列化,JSON都占据着重要位置,本文将从JSON的基础概念、核心特性、常见面试题(含代码示例)到进阶应用场景,全面梳理面试中可能涉及的JSON知识点,助你从容应对面试。
JSON是什么?核心特性有哪些?
定义
JSON是一种轻量级的数据交换格式,基于JavaScript的一个子集(ECMAScript 3 1999标准),但独立于语言,几乎所有编程语言都支持JSON的解析和生成,其设计目标是“让人类易于读写,让机器易于解析和生成”。
核心特性
- 文本格式:JSON是纯文本,以
.json为文件后缀,可通过HTTP传输(如Content-Type: application/json)。 - 数据结构简单:支持两种核心结构:
- 对象(Object):无序的键值对集合,键必须是字符串(需用双引号包裹),值可以是多种类型。
- 数组(Array):有序的值集合,值可以是多种类型。
- 值类型丰富:支持6种数据类型:
- 基本类型:字符串(
"string")、数字(123、14)、布尔值(true/false)、null - 复合类型:对象()、数组(
[])
- 基本类型:字符串(
- 严格语法:
- 键必须用双引号(单引号非法);
- 值如果是字符串,必须用双引号;
- 末尾不能有逗号(如
{"name": "张三",}非法); - 支持嵌套结构(对象嵌套数组、数组嵌套对象等)。
与XML的对比(高频面试题)
| 特性 | JSON | XML |
|---|---|---|
| 可读性 | 更简洁(无标签嵌套) | 较繁琐(标签闭合) |
| 数据体积 | 更小(无结束标签) | 更大(重复标签) |
| 解析难度 | 解析简单(直接映射为语言对象) | 需DOM/SAX解析,较复杂 |
| 数据类型 | 原生支持数字、布尔、null等 | 所有数据均视为文本 |
| 扩展性 | 不支持注释(部分库扩展支持) | 支持注释、CDATA等 |
JSON的语法规则(细节决定成败)
面试中常通过“挑错题”考察对JSON语法的,以下是关键语法规则及示例:
对象(Object)
- 语法:
{"key1": value1, "key2": value2, ...} - 规则:
- 键必须是字符串,且必须用双引号()包裹;
- 值可以是任意JSON支持的类型;
- 键值对之间用逗号()分隔,最后一个键值对后不能有逗号。
合法示例:
{
"name": "李四",
"age": 25,
"isStudent": false,
"courses": ["math", "english"],
"address": {
"city": "Beijing",
"zip": 100000
}
}
非法示例(常见错误):
// 键用单引号(非法)
{'name': '王五'}
// 末尾有逗号(非法)
{"age": 30, "hobby": "reading",}
// 值为数字类型加引号(虽合法但非数字,需注意)
{"score": "95"} // 此时score是字符串,不是数字
数组(Array)
- 语法:
[value1, value2, ...] - 规则:
- 值可以是任意JSON支持的类型;
- 元素之间用逗号()分隔,最后一个元素后不能有逗号。
合法示例:
[
{"id": 1, "name": "商品A"},
{"id": 2, "name": "商品B"},
null
]
非法示例:
// 数组末尾有逗号(非法) [1, 2, 3,]
数据类型细节
- 字符串:必须用双引号,支持转义字符(如
\n、\t、\"、\\),但不支持单引号()。{"message": "他说:\"你好!\""} - 数字:支持整数、浮点数,不支持科学计数法(部分解析器支持,但JSON标准未定义)。
{"price": 99.9, "count": 100} - 布尔值与null:必须是小写(
true/false/null,大写非法)。{"isActive": true, "data": null}
JSON在开发中的核心应用场景
面试中常结合实际场景考察JSON的使用,以下是高频应用点:
前后端数据交互(核心场景)
- 场景描述:前端通过AJAX/Fetch请求后端API,后端返回JSON格式数据,前端解析后渲染页面。
- 示例:
- 后端返回JSON:
{"code": 200, "data": [{"id": 1, "name": "苹果"}], "msg": "success"} - 前端解析(JavaScript):
fetch('/api/fruits') .then(response => response.json()) // 解析JSON字符串为JS对象 .then(data => { console.log(data.data[0].name); // 输出:苹果 });
- 后端返回JSON:
配置文件
- 场景描述:项目中的静态配置(如环境变量、数据库连接信息)常用JSON存储,便于管理和修改。
- 示例(
config.json):{ "env": "production", "database": { "host": "localhost", "port": 3306, "username": "root", "password": "123456" }, "features": { "enableCache": true, "maxConnections": 100 } }
数据序列化与反序列化
-
序列化:将内存中的对象/数据结构转换为JSON字符串(便于传输或存储)。
-
反序列化:将JSON字符串解析为内存中的对象/数据结构(便于程序处理)。
-
示例(JavaScript):
// 序列化:JS对象 -> JSON字符串 const obj = { name: "赵六", hobbies: ["coding", "travel"] }; const jsonString = JSON.stringify(obj); console.log(jsonString); // 输出:{"name":"赵六","hobbies":["coding","travel"]} // 反序列化:JSON字符串 -> JS对象 const parsedObj = JSON.parse(jsonString); console.log(parsedObj.hobbies[0]); // 输出:coding
API响应格式(RESTful API)
-
场景描述:RESTful API通常以JSON作为标准响应格式,统一前后端数据交互规范。
-
常见响应结构:
// 成功响应 { "code": 200, "data": { "userId": 123, "token": "abc123..." }, "message": "登录成功" } // 错误响应 { "code": 400, "error": "Bad Request", "message": "用户名不能为空" }
高频面试题与解析(含代码示例)
JSON.parse() 和 JSON.stringify() 的使用场景及注意事项?
解析:
- JSON.parse():将JSON字符串解析为JS对象/数组。
- 使用场景:处理AJAX/Fetch返回的JSON响应、读取JSON配置文件。
- 注意事项:
- 参数必须是有效的JSON字符串,否则抛出
SyntaxError; - 可传入第二个参数(
reviver函数)用于转换解析后的值:
- 参数必须是有效的JSON字符串,否则抛出



还没有评论,来说两句吧...