嵌入式大厂面经 JSON数据格式常考面试题(持续更新中!)

这是一个嵌入式大厂面试题专栏,每天更新高频面试题。专栏将包含题目描述、详细解析、相关知识点扩展以及实际代码示例。内容涵盖操作系统、驱动开发、通信协议等核心领域,并结合实际项目经验进行分析。每道题目都会附带面试官可能的追问方向,帮助大家更好地准备面试!

JSON数据格式常见面试题

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,在各种编程语言和平台间广泛使用。以下是关于JSON的常见面试题及详细解答。

一、基础概念

1. 什么是JSON?

  • JSON是一种轻量级的数据交换格式
  • 基于JavaScript的一个子集
  • 易于人阅读和编写,同时也易于机器解析和生成
  • 与语言无关,使用了类似C语言家族的习惯

2. JSON的基本数据类型

  • 数字(整数或浮点数)
  • 字符串(双引号包围)
  • 布尔值(true或false)
  • 数组(方括号包围)
  • 对象(花括号包围)
  • null

3. JSON的基本语法规则

{
    "name": "张三",
    "age": 30,
    "isStudent": false,
    "courses": ["数学", "物理", "化学"],
    "address": {
        "city": "北京",
        "street": "朝阳区"
    },
    "phoneNumber": null
}

二、常见面试题与解答

1. JSON与XML相比有哪些优势?

解答:

  1. 数据结构简洁:JSON的语法更简洁,没有XML的结束标签
  2. 解析效率高:JSON解析速度更快,占用资源更少
  3. 数据体积小:相同数据,JSON格式通常比XML更小
  4. 原生支持:JavaScript可以直接解析JSON,无需额外库
  5. 数据类型丰富:JSON支持数组类型,而XML需要特殊处理

示例对比:

// JSON格式
{
    "student": {
        "name": "张三",
        "age": 20,
        "scores": [85, 90, 92]
    }
}

<!-- XML格式 -->
<student>
    <name>张三</name>
    <age>20</age>
    <scores>
        <score>85</score>
        <score>90</score>
        <score>92</score>
    </scores>
</student>

2. JSON的解析方法有哪些?各有什么特点?

解答:

  1. DOM解析将整个JSON文档加载到内存中构建树结构优点:可随机访问文档的任何部分缺点:内存消耗大,不适合大型文档
  2. SAX解析(流式解析)逐个读取JSON元素,触发相应事件优点:内存消耗小,适合大型文档缺点:只能顺序访问,无法随机访问
  3. 反序列化直接将JSON转换为编程语言中的对象优点:使用方便,直接操作对象缺点:需要预定义对象结构

各语言实现示例:

// JavaScript解析
const jsonStr = '{"name":"张三","age":30}';
const obj = JSON.parse(jsonStr);  // 字符串转对象
console.log(obj.name);  // 输出: 张三

const newJsonStr = JSON.stringify(obj);  // 对象转字符串

# Python解析
import json

json_str = '{"name":"张三","age":30}'
obj = json.loads(json_str)  # 字符串转对象
print(obj['name'])  # 输出: 张三

new_json_str = json.dumps(obj)  # 对象转字符串

// C语言使用cJSON库解析
#include "cJSON.h"

const char *json_str = "{\"name\":\"张三\",\"age\":30}";
cJSON *json = cJSON_Parse(json_str);
cJSON *name = cJSON_GetObjectItem(json, "name");
printf("%s\n", name->valuestring);  // 输出: 张三

char *new_json_str = cJSON_Print(json);
cJSON_Delete(json);  // 释放内存
free(new_json_str);  // 释放内存

3. JSON Schema是什么?有什么用途?

解答:

  • 定义:JSON Schema是一种用于描述JSON数据结构的规范
  • 用途:验证JSON数据的结构和内容是否符合预期自动生成文档提供自动完成和验证功能作为API契约的一部分
  • 示例:
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 2,
      "maxLength": 50
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 120
    },
    "email": {
      "type": "string",
      "format": "email"
    }
  },
  "required": ["name", "email"]
}

4. JSON中的转义字符有哪些?如何处理特殊字符?

解答:JSON中的常用转义字符:

  • \":双引号
  • \\:反斜杠
  • \/:正斜杠
  • \b:退格符
  • \f:换页符
  • \n:换行符
  • \r:回车符
  • \t:制表符
  • \uXXXX:Unicode字符

处理特殊字符示例:

// JavaScript中处理特殊字符
const jsonStr = '{"message":"Hello\\nWorld"}';
const obj = JSON.parse(jsonStr);
console.log(obj.message);  // 输出: Hello
                          //       World

// 包含Unicode字符
const unicodeStr = '{"name":"\\u5F20\\u4E09"}';  // "张三"的Unicode编码
const unicodeObj = JSON.parse(unicodeStr);
console.log(unicodeObj.name);  // 输出: 张三

5. 如何处理JSON中的日期时间?

解答:JSON本身不支持日期类型,常见的处理方式有:

  1. ISO 8601字符串格式
{
  "createdAt": "2023-05-15T08:30:00Z"
}

  1. 时间戳(毫秒数)
{
  "createdAt": 1684138200000
}

  1. 自定义对象
{
  "createdAt": {
    "year": 2023,
    "month": 5,
    "day": 15,
    "hour": 8,
    "minute": 30,
    "second": 0
  }
}

处理示例:

// JavaScript处理日期
const obj = {
  name: "事件",
  createdAt: new Date()
};

// 序列化时自动转为ISO字符串
const jsonStr = JSON.stringify(obj);
console.log(jsonStr);  // {"name":"事件","createdAt":"2023-05-15T08:30:00.000Z"}

// 解析时需要手动转换回Date对象
const parsedObj = JSON.parse(jsonStr);
const date = new Date(parsedObj.createdAt);

// 自定义序列化和反序列化
const obj = {
  name: "事件",
  createdAt: new Date()
};

// 自定义序列化
const jsonStr = JSON.stringify(obj, (key, value) => {
  if (key === 'createdAt' &

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
06-17 21:57
门头沟学院 Java
白友:噗嗤,我发现有些人事就爱发这些,明明已读不回就行了,就是要恶心人
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务