JSON:什么是JSON、数据结构及工作原理

作者: IT Sectr 发布日期: 2026-03-08 阅读时间: 8 分钟

JSON(JavaScript Object Notation)是一种基于JavaScript对象语法的轻量级文本数据交换格式。它无处不在:从REST API和配置文件到数据库和移动应用中的数据存储。根据JSON官方网站,该格式不依赖于编程语言,几乎所有现代平台都支持它。JSON已成为客户端和服务器之间数据传输的事实标准。

要点

  • JSON — 基于JavaScript语法的轻量级文本格式,用于结构化数据
  • 六种数据类型 — 字符串、数字、布尔值、null、数组和对象,适用于任何结构
  • 通用性 — 所有编程语言和平台都支持
  • REST API — Web和移动应用中数据交换的主要格式
  • 可读性 — 简单的语法无需工具即可轻松阅读和编辑

什么是JSON?

JSON是一种基于JavaScript语法的文本格式,用于表示结构化数据。尽管源于JavaScript,该格式完全独立于语言——所有流行的编程语言都有相应的解析器和序列化器。

JSON的历史始于21世纪初,当时Douglas Crockford提取了JavaScript语法的一个子集用于数据交换。2013年,该格式被标准化为ECMA-404,后来成为ISO/IEC 21778:2017。名称代表JavaScript Object Notation。

JSON的主要优势在于其极简的语法。描述数据只需使用六种类型:字符串、数字、布尔值、null、数组和对象。这足以表示应用程序中使用的任何数据结构。

JSON的使用场景

  • REST API — 服务器和客户端之间请求和响应的主要格式
  • 配置文件 — package.json、tsconfig.json、.prettierrc
  • 数据库 — MongoDB、PostgreSQL(JSONB)、Firebase Firestore
  • 移动应用 — 存储设置、数据缓存
  • Web技术 — WebSocket、Server-Sent Events、localStorage

JSON语法和数据类型

JSON语法极为简单:数据以键值对的形式表示,其中键是双引号内的字符串,值是六种基本类型之一。对象用花括号括起来,数组用方括号括起来。字符串必须使用双引号,单引号不允许使用。

JSON中的数字可以是整数或浮点数、正数或负数,可以用指数表示法。布尔值用true和false表示,空值用null表示。数组包含任意类型值的有序集合,包括嵌套的数组和对象。

json
{
  "name": "JSON",
  "type": "text",
  "version": 2024,
  "flexible": true,
  "extensions": null,
  "languages": [
    "JavaScript",
    "Python",
    "Java"
  ],
  "nested": {
    "info": "嵌套支持"
  }
}
类型 示例 描述
字符串 “文本” 在双引号内,带转义序列
数字 42 整数、浮点数、指数
布尔值 true true或false — 不带引号
null null 无值
对象 {} 无序的键值对集合
数组 [] 有序的值列表

REST API中的JSON

JSON是移动和Web开发中REST API的主要数据交换格式。服务器在响应体中发送JSON,客户端在请求体中发送JSON。JSON的标准Content-Type标头是application/json。

现代REST API使用JSON传输所有类型的数据:从简单的列表到具有实体间关系的复杂嵌套结构。客户端库(例如JavaScript中的Axios或Android上的Retrofit)会自动序列化和反序列化JSON,使开发人员无需手动解析。

JSON在REST API中的一个重要优势是通过请求参数进行部分数据传输(partial response)的能力,以及无需额外服务器请求即可支持嵌套资源。

移动平台上的JSON解析

JSON解析在移动平台上使用内置工具完成。Android使用Google的Gson或Square的Moshi库,iOS使用带有JSONDecoder的Codable协议。每个平台都提供了方便的JSON与原生对象之间相互转换的工具。

Android上的JSON(Kotlin)

在Android上,使用GsonMoshi的方法很流行。只需定义带有@SerializedName注释的data class并调用fromJson进行反序列化即可。库会自动将JSON中的字段名与类的字段匹配。

kotlin
import com.google.gson.Gson
import com.google.gson.annotations.SerializedName

data class User(
    @SerializedName("id") val id: Int,
    @SerializedName("name") val name: String,
    @SerializedName("email") val email: String
)

fun parseJson(jsonString: String): User {
    val gson = Gson()
    return gson.fromJson(jsonString, User::class.java)
}

iOS上的JSON(Swift)

在iOS上,使用内置的Codable协议和JSONDecoder。数据结构被声明为带有Codable协议的struct,然后JSON通过一行代码解析。JSONEncoder执行反向序列化——将对象转换为JSON以发送到服务器。

swift
import Foundation

struct User: Codable {
    let id: Int
    let name: String
    let email: String
}

func parseJSON(from data: Data) throws -> User {
    let decoder = JSONDecoder()
    return try decoder.decode(User.self, from: data)
}

JSON vs XML:格式比较

JSON和XML是传输结构化数据的两种主要格式。JSON在简单性和性能方面胜出,XML在严格性和验证方面胜出。它们之间的选择取决于项目需求:对于REST API通常选择JSON,对于带有架构的复杂文档选择XML。

XML要求每个元素都有闭合标签,这使得数据大小比JSON大2-3倍。同时,XML支持命名空间、XSD架构、属性和XSLT转换,这使其在文档流和企业系统集成任务中更加强大。

特性 JSON XML
语法 极简,键值对 基于标签,开标签和闭标签
数据大小 紧凑 比JSON大2-3倍
数据类型 六种基本类型 仅文本,类型通过架构
验证 无内置,通过JSON Schema XSD — 严格且成熟
命名空间 完全支持namespace
解析速度 较低,由于复杂性

JSON使用示例

示例展示了移动开发中JSON的典型操作:解析API响应、创建用于发送的JSON以及处理嵌套结构。理解这些模式对于每个移动应用开发人员来说都是必不可少的。

对象序列化为JSON

在JavaScript中,JSON.stringify将对象转换为JSON字符串。第二个参数可以是键数组用于选择性序列化,也可以是替换函数。第三个参数设置格式化的缩进。

typescript
interface Order {
  id: string;
  items: OrderItem[];
  total: number;
  createdAt: string;
}

const order: Order = {
  id: 'ord_001',
  items: [{ product: 'phone', quantity: 2 }],
  total: 1599.98,
  createdAt: '2026-07-03T10:00:00Z'
};

const jsonString = JSON.stringify(order, null, 2);

解析嵌套JSON

在Kotlin中使用Moshi库,嵌套的JSON对象通过嵌套的data classes处理。@Json注释指示JSON中的字段名(如果与类的属性名不同)。数组表示为List,带有元素类型。

kotlin
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory

data class ApiResponse(
    val status: String,
    val data: List<Product>,
    val pagination: Pagination
)

data class Product(
    val id: Int,
    val title: String,
    val price: Double
)

data class Pagination(
    val page: Int,
    val total: Int
)

val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

JSON Schema:结构验证

JSON Schema是一种描述JSON文档结构的语言,类似于XML的XSD。使用JSON Schema可以设置必填字段、数据类型、值范围、字符串模式和嵌套结构。根据架构进行验证可以在数据在应用程序中处理之前检测数据错误。

JSON Schema广泛用于OpenAPI(Swagger)以文档化REST API、在输入验证表单和测试中。架构文件本身是一个JSON文档,允许使用标准JSON解析器读取它。所有流行的编程语言都有在线验证器和库。

在移动开发中,JSON Schema用于在测试阶段验证服务器的响应以及检查配置文件。诸如Android上的network-validator和json-schema-validator之类的库允许将验证直接嵌入开发过程中,从而在早期阶段防止错误。

常见问题

JSON支持哪些数据类型?

JSON支持六种类型:字符串(在双引号内)、数字(整数和浮点数)、布尔值(true/false)、null、对象({}内的键值对)和数组([]内的值列表)。这足以满足应用程序中的任何数据结构。

JSON中可以使用注释吗?

不可以,JSON标准不支持注释。如果需要注释,请使用JSON5(扩展JSON)或添加带有描述的字段,例如“_comment”:“说明”。某些工具(如VS Code)支持配置文件JSON中的注释,但这是非标准扩展。

JSON与PostgreSQL中的JSONB有何不同?

JSONB是PostgreSQL中JSON的二进制存储格式。与文本JSON不同,JSONB处理速度更快,支持索引(GIN索引)并保证键的唯一性。同时,由于添加了元数据,JSONB占用更多磁盘空间。

如何检查JSON的有效性?

使用JSONLint(jsonlint.com)进行快速检查,使用JavaScript中带try-catch的内置JSON.parse(),或使用IDE插件。验证包括检查引号正确性、括号闭合和类型一致性。对于复杂架构,请使用JSON Schema Validator。

JSON文件的最大大小是多少?

JSON规范中没有限制。实际上,大小受设备内存和解析器能力的限制。对于移动应用,建议每个响应不超过1-2 MB,对于大数据使用分页或流传输。

总结

  • JSON — 具有六种数据类型的极简文本格式,用于结构化信息交换
  • 语言无关 — JSON解析器适用于所有流行的编程语言
  • REST API使用JSON作为移动应用中请求和响应数据的标准格式
  • 解析通过内置工具完成:Android上使用Gson/Moshi,iOS上使用Codable
  • JSON比XML紧凑2-3倍,但在性能上不如Protobuf
  • 可读性 — 语法易于阅读和调试,无需特殊工具
  • JSON Schema — 用于验证结构和数据类型的附加工具

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读