JSON 格式

文章目录

  • [JSON 格式学习笔记](#JSON 格式学习笔记)
    • [1. 什么是 JSON](#1. 什么是 JSON)
      • [为什么用 JSON](#为什么用 JSON)
    • [2. JSON 基本数据类型](#2. JSON 基本数据类型)
    • [3. JSON 对象](#3. JSON 对象)
    • [4. JSON 数组](#4. JSON 数组)
    • [5. JSON 与 MQTT 配合](#5. JSON 与 MQTT 配合)
      • [为什么 MQTT 用 JSON](#为什么 MQTT 用 JSON)
      • 消息示例
      • [如何设计良好的 JSON 消息](#如何设计良好的 JSON 消息)
    • [6. JSON Schema](#6. JSON Schema)
    • [7. JSON 常见问题](#7. JSON 常见问题)
      • [7.1 数字 vs 字符串](#7.1 数字 vs 字符串)
      • [7.2 布尔值 vs 0/1](#7.2 布尔值 vs 0/1)
      • [7.3 时间戳格式](#7.3 时间戳格式)
      • [7.4 空值处理](#7.4 空值处理)
    • [8. JSON 验证工具](#8. JSON 验证工具)

JSON 格式学习笔记

1. 什么是 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于 JavaScript 语法子集,但语言无关。

为什么用 JSON

  • 可读性好:纯文本,直观
  • 跨语言:几乎所有编程语言都有 JSON 解析库
  • 轻量:比 XML 更简洁
  • 自描述:字段名即含义

2. JSON 基本数据类型

类型 示例 说明
字符串 "hello" 双引号包裹
数字 42、3.14 整数或浮点数
布尔值 true、false 小写
空值 null 表示空
数组 [1, 2, 3] 有序列表
对象 {"key": "value"} 键值对集合

注意事项

json 复制代码
// ❌ 错误写法
{
  name: "张三",           // 键名必须用双引号
  "age": 30,              // 正确
  "is_student": false,    // 正确
  "scores": [90, 85],     // 正确
  "description": 'hello'  // 字符串必须用双引号,不能用单引号
}

3. JSON 对象

对象是键值对的无序集合,用 {} 包裹:

json 复制代码
{
  "name": "装载机001",
  "type": "loader",
  "speed": 12.5,
  "connected": true
}

嵌套对象

对象的值可以是另一个对象,形成嵌套结构:

json 复制代码
{
  "vehicle": {
    "speed": 12.5,
    "gear": 1
  },
  "body": {
    "device_power": 78.5,
    "fault_level": 0
  }
}

嵌套结构的好处是按功能域分组,前端按需消费,不需要关心不相关的字段。


4. JSON 数组

数组是有序列表,用 [] 包裹:

json 复制代码
// 数字数组
[1, 2, 3, 4, 5]

// 字符串数组
["front", "back", "left", "right"]

// 对象数组
[
  {"code": 1, "label": "急停触发"},
  {"code": 4, "label": "通讯中断"}
]

数组常用于列表、批量数据、告警集合等场景。


5. JSON 与 MQTT 配合

为什么 MQTT 用 JSON

  • 解耦:发布者和订阅者通过 JSON 格式约定通信,不依赖具体语言
  • 可扩展:增加字段不影响已有客户端
  • 自描述:每个字段有名称,比二进制协议更容易调试

消息示例

json 复制代码
// 车辆状态消息(MQTT payload)
{
  "timestamp": 1723345678123,
  "vehicle": {
    "speed": 12.5,
    "gear": 1
  },
  "body": {
    "device_power": 78.5
  }
}

如何设计良好的 JSON 消息

  1. 字段名一致:全程用 snake_case 或 camelCase,本项目用 snake_case
  2. 嵌套分组:按功能域分组,避免扁平化
  3. 必填最小化:只标记本身没有意义就无法消费的字段
  4. 类型明确:数字用 number,开关用 boolean,枚举用 string

6. JSON Schema

JSON Schema 是描述 JSON 数据结构的标准,用于验证消息格式是否正确。

基本结构

json 复制代码
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "名称"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150
    }
  },
  "required": ["name"]
}

常用关键字

关键字 作用 示例
type 指定类型 "type": "string"
properties 定义对象属性 "properties": {...}
required 必填字段列表 "required": ["name"]
minimum / maximum 数值范围 "minimum": 0
enum 枚举值 "enum": ["a", "b"]
description 字段说明 "description": "车速"
$ref 引用外部定义 "$ref": "common.json#/definitions/timestamp"

示例:验证车速

json 复制代码
// Schema
{
  "type": "object",
  "properties": {
    "speed": {
      "type": "number",
      "minimum": 0,
      "maximum": 80,
      "description": "车速 (km/h)"
    }
  },
  "required": ["speed"]
}
json 复制代码
// 合法消息
{"speed": 12.5}    // 通过

// 非法消息  
{"speed": -1}      // 不通过,小于 minimum
{"speed": "12.5"}  // 不通过,类型应为 number
{}                 // 不通过,缺少必填字段

7. JSON 常见问题

7.1 数字 vs 字符串

json 复制代码
// ❌ 混淆
{"speed": "12.5"}   // 字符串,不是数字
{"speed": 12.5}     // 正确,数字

// 前端处理时 typeof 不同
typeof "12.5"  → "string"
typeof 12.5    → "number"

7.2 布尔值 vs 0/1

json 复制代码
// ✅ 推荐:使用布尔值
{"charging": true}

// ❌ 不推荐:使用 0/1
{"charging": 1}

7.3 时间戳格式

json 复制代码
// Unix 毫秒整数(性能好,适合高频数据)
{"timestamp": 1723345678123}

// ISO 8601 字符串(可读性好,适合调试)
{"timestamp": "2026-08-11T10:30:00.123Z"}

7.4 空值处理

json 复制代码
// 字段不存在
{"speed": 12.5}     // 没有 power 字段

// 字段为 null
{"speed": 12.5, "power": null}  // power 明确为空

// 推荐:数据不存在时不发该字段,而不是发 null

8. JSON 验证工具

工具 用途 链接
JSONLint JSON 语法验证 jsonlint.com
ajv JSON Schema 验证(Node.js) npm install ajv
Python json 内置 json 模块 import json

命令行验证

bash 复制代码
# Python 验证 JSON 语法
python -c "import json; json.load(open('file.json'))"

# 使用 ajv 验证 Schema
ajv validate -s schema.json -d data.json
相关推荐
丨白色风车丨2 天前
Python中JSON与字典/列表的相互转换详解
windows·python·json
鱼宵3 天前
LangChain4j 结构化输出:让模型吐出 Java 对象,JSON 不再手写解析
java·开发语言·json·langchain4j
leisoo80973 天前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
胖头鱼的鱼缸(尹海文)4 天前
胖头鱼的技术专栏-474 从能跑到能上线:PG SplitJSON 0.2.0 和 0.1.0 差在哪(20261008)
postgresql·json
?? Daisy5 天前
Claude Code 接入 GPT:settings.json 两种配置方法(2026-10)
gpt·json
小静AI工程实验室5 天前
Python 爬虫解析 JSON-LD:多块 script、@graph 与坏数据的 9 个边界
爬虫·python·json
goehou6 天前
LLM 结构化输出全解:从 Prompt 约束到 Schema 硬保证,三层实现怎么选
ai·llm·json·agent·教程·结构化输出
独立开发者阿乐6 天前
结构化数据 JSON-LD 实战:让 AI 读懂你的网页
人工智能·json·结构化数据·geo优化·json-ld·ai收录·faqpage
liangshanbo12158 天前
高级前端面试题:package.json 常见字段
前端·json
梦帮科技8 天前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链