JSON(JavaScript Object Notation)是一种基于JavaScript对象语法的轻量级文本数据交换格式。它无处不在:从REST API和配置文件到数据库和移动应用中的数据存储。根据JSON官方网站,该格式不依赖于编程语言,几乎所有现代平台都支持它。JSON已成为客户端和服务器之间数据传输的事实标准。
要点
JSON是一种基于JavaScript语法的文本格式,用于表示结构化数据。尽管源于JavaScript,该格式完全独立于语言——所有流行的编程语言都有相应的解析器和序列化器。
JSON的历史始于21世纪初,当时Douglas Crockford提取了JavaScript语法的一个子集用于数据交换。2013年,该格式被标准化为ECMA-404,后来成为ISO/IEC 21778:2017。名称代表JavaScript Object Notation。
JSON的主要优势在于其极简的语法。描述数据只需使用六种类型:字符串、数字、布尔值、null、数组和对象。这足以表示应用程序中使用的任何数据结构。
JSON语法极为简单:数据以键值对的形式表示,其中键是双引号内的字符串,值是六种基本类型之一。对象用花括号括起来,数组用方括号括起来。字符串必须使用双引号,单引号不允许使用。
JSON中的数字可以是整数或浮点数、正数或负数,可以用指数表示法。布尔值用true和false表示,空值用null表示。数组包含任意类型值的有序集合,包括嵌套的数组和对象。
{
"name": "JSON",
"type": "text",
"version": 2024,
"flexible": true,
"extensions": null,
"languages": [
"JavaScript",
"Python",
"Java"
],
"nested": {
"info": "嵌套支持"
}
}
| 类型 | 示例 | 描述 |
|---|---|---|
| 字符串 | “文本” |
在双引号内,带转义序列 |
| 数字 | 42 |
整数、浮点数、指数 |
| 布尔值 | true |
true或false — 不带引号 |
| null | null |
无值 |
| 对象 | {} |
无序的键值对集合 |
| 数组 | [] |
有序的值列表 |
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解析在移动平台上使用内置工具完成。Android使用Google的Gson或Square的Moshi库,iOS使用带有JSONDecoder的Codable协议。每个平台都提供了方便的JSON与原生对象之间相互转换的工具。
在Android上,使用Gson或Moshi的方法很流行。只需定义带有@SerializedName注释的data class并调用fromJson进行反序列化即可。库会自动将JSON中的字段名与类的字段匹配。
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上,使用内置的Codable协议和JSONDecoder。数据结构被声明为带有Codable协议的struct,然后JSON通过一行代码解析。JSONEncoder执行反向序列化——将对象转换为JSON以发送到服务器。
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和XML是传输结构化数据的两种主要格式。JSON在简单性和性能方面胜出,XML在严格性和验证方面胜出。它们之间的选择取决于项目需求:对于REST API通常选择JSON,对于带有架构的复杂文档选择XML。
XML要求每个元素都有闭合标签,这使得数据大小比JSON大2-3倍。同时,XML支持命名空间、XSD架构、属性和XSLT转换,这使其在文档流和企业系统集成任务中更加强大。
| 特性 | JSON | XML |
|---|---|---|
| 语法 | 极简,键值对 | 基于标签,开标签和闭标签 |
| 数据大小 | 紧凑 | 比JSON大2-3倍 |
| 数据类型 | 六种基本类型 | 仅文本,类型通过架构 |
| 验证 | 无内置,通过JSON Schema | XSD — 严格且成熟 |
| 命名空间 | 无 | 完全支持namespace |
| 解析速度 | 高 | 较低,由于复杂性 |
示例展示了移动开发中JSON的典型操作:解析API响应、创建用于发送的JSON以及处理嵌套结构。理解这些模式对于每个移动应用开发人员来说都是必不可少的。
在JavaScript中,JSON.stringify将对象转换为JSON字符串。第二个参数可以是键数组用于选择性序列化,也可以是替换函数。第三个参数设置格式化的缩进。
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);
在Kotlin中使用Moshi库,嵌套的JSON对象通过嵌套的data classes处理。@Json注释指示JSON中的字段名(如果与类的属性名不同)。数组表示为List,带有元素类型。
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文档结构的语言,类似于XML的XSD。使用JSON Schema可以设置必填字段、数据类型、值范围、字符串模式和嵌套结构。根据架构进行验证可以在数据在应用程序中处理之前检测数据错误。
JSON Schema广泛用于OpenAPI(Swagger)以文档化REST API、在输入验证表单和测试中。架构文件本身是一个JSON文档,允许使用标准JSON解析器读取它。所有流行的编程语言都有在线验证器和库。
在移动开发中,JSON Schema用于在测试阶段验证服务器的响应以及检查配置文件。诸如Android上的network-validator和json-schema-validator之类的库允许将验证直接嵌入开发过程中,从而在早期阶段防止错误。
常见问题
JSON支持六种类型:字符串(在双引号内)、数字(整数和浮点数)、布尔值(true/false)、null、对象({}内的键值对)和数组([]内的值列表)。这足以满足应用程序中的任何数据结构。
不可以,JSON标准不支持注释。如果需要注释,请使用JSON5(扩展JSON)或添加带有描述的字段,例如“_comment”:“说明”。某些工具(如VS Code)支持配置文件JSON中的注释,但这是非标准扩展。
JSONB是PostgreSQL中JSON的二进制存储格式。与文本JSON不同,JSONB处理速度更快,支持索引(GIN索引)并保证键的唯一性。同时,由于添加了元数据,JSONB占用更多磁盘空间。
使用JSONLint(jsonlint.com)进行快速检查,使用JavaScript中带try-catch的内置JSON.parse(),或使用IDE插件。验证包括检查引号正确性、括号闭合和类型一致性。对于复杂架构,请使用JSON Schema Validator。
JSON规范中没有限制。实际上,大小受设备内存和解析器能力的限制。对于移动应用,建议每个响应不超过1-2 MB,对于大数据使用分页或流传输。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。