【备课专用】JSON的基本概念、示例、常见开发语言的解析(持续更新……)
JSON 全面解析:格式、特殊示例与多语言解析
什么是JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON由Douglas Crockford在2001年提出,现已成为Web应用程序中最常用的数据交换格式之一。
JSON的主要特点包括:
易于人类阅读和编写
易于机器解析和生成
支持复杂数据结构
完全独立于语言
JSON基本格式
JSON由两种基本结构组成:
键值对集合:在各种语言中被实现为对象、记录、结构、字典、哈希表、有键列表或关联数组
有序值列表:在大多数语言中被实现为数组、向量、列表或序列
基本语法规则
数据在键值对中
数据由逗号分隔
大括号 {} 保存对象
中括号 [] 保存数组
字符串必须使用双引号 "" 表示
数据类型
JSON支持以下数据类型:
字符串(必须使用双引号)
数字(整数或浮点数)
布尔值(true/false)
数组(在中括号中)
对象(在大括号中)
null
JSON示例
基本示例
{
"name": "张三",
"age": 30,
"isStudent": false,
"hobbies": ["阅读", "游泳", "编程"],
"address": {
"street": "科技路",
"city": "北京",
"postalCode": "100000"
},
"married": null
}
特殊示例:嵌入BASE64格式的文件
{
"document": {
"filename": "example.pdf",
"mimeType": "application/pdf",
"size": 24576,
"content": "JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nDPQM1Qo5ypUMFAwAHM..."
}
}
特殊示例:嵌入BASE64格式的图片
{
"profile": {
"name": "李四",
"avatar": {
"description": "个人头像",
"mimeType": "image/png",
"width": 200,
"height": 200,
"data": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAgAElEQVR4Xu19B3hU1fb1..."
}
}
}
复杂嵌套示例
{
"company": "TechCorp",
"founded": 2005,
"departments": [
{
"name": "研发部",
"manager": "王五",
"employees": 15,
"projects": [
{
"name": "下一代产品",
"status": "进行中",
"deadline": "2023-12-31"
}
]
},
{
"name": "市场部",
"manager": "赵六",
"employees": 8,
"projects": "@@@1F8B08000000000004008555594F234710FE2BFD98E4C1608E405E23912892451E36C73352888292EC4AEC91D7B1C1780C366316631B1FF181BD10C06373C4C78C8FFF0253D5334FFC8554BB87D931218A842CBABAEAABEAAAAFBE79B718082E31CC36B0587E18E4E766E7E602B30BC276AFA49C58D2FE10B65BB798DBBF570EE81E0A15AB67B0C0EAFA1BF6D5E6DAEFEB7FBCDAFC952D04161974AFAD5E12B42CE839CCF431DDC244F86190B07A69F6C3C6EBB76BBFB1176FDEFEB4F18A891C4CF8EE24A5D773703CBF0D0305344A9AC0A3A81D3BC7669DC755FBEF2E59422B2F42DFACB0D56FBF5B61908C71E3F4D9AA96EF9508C39B332AFCC78D97C1D919F11BE4E93354BB6EB1C32B384C921BDD2CCD2CCF2C07DC6BA7A8607C0F76CF408FDB27D1C04B82FED90FCD20B58FCD13E8F5ACE1986244AA209506B53F61B74219A97FA0F77978449DE3851E446F60B76C6F0DC991AE8293D624E95D931CAEDF9D92A63FD9155B1FF1A1EE2871ABD7E497695B6F43F1CC1A97A099C36CE7492C4F9751F5F289047394C06FC54CCC323B5E0ED05AD4323FBA7CAE0CB17A0A5E56FD70F3E2696AC539AEFF279CD9900E7E501A23C6152CC6A7A3226CCEDF2AACC49C5A0ED4AC5DA53E869DE36DF29247E94305488A626EC4EB06A585F7094150E9591811021909987A44766E0E20A5CA0E929DCA710B6CF55D9C52038D1481B8C7CA00069A3D2ED8D5C4635484CDFB6B9C2A4A4B40CCC4728317F75CFBE368D9823FE84E29F253534C496D43B403FA16BF3241BDB8534A3242B03BD3B74663185F384A19DA3B6EDF9E8B12F08B5335E553FC342C23E8D27F24FED2EA8A154AB544A32E72B42458DA728E53B2517E67D0CEA916F91E811FEDF041C61ED1EEA9D658C7749F862267CB9BF187411C0F93D6B0482920AADAC34B4CD6884B784C64CD7BC5B0CFFD95CAE7C9D6CE8096C18E2AE92B094DFE3CD2A79EF2DD0E2A61AC68FE5BD7988961F112923734CAFF87634B53E9EBC4BBA1FB58B5ED4474AE5F9197DC34AFEB183F844454AC8CBA63191792AD9F7C1678FDCBDAE6FAA702B0DFA1878BC589E874E5CE5E3B70447FDADC3C003D4F94F7F0D9F21336388A0231434847AE05A90F341C2A3AB44A04E09706B1423E49043DC7633F41857E980DDC3F05B543CEA1D527D0AE3A4C2510157D210207394864C4E265DA601A2EE5DA63D215AF5EC7CCD97A5D12CF63A9D446504BA40E3ED99BF563FEBB6C7E94704AB5470717DF95B76A1F0C0DB4AE60D8C46E193B72BA78A2F0DBDA47376FC382C127E968F9797322B3F96D7B7408D186CCE8E582FD1DD0AEA51BA913EEFDE543134A64B7B7F0E896D0E408E5FC2439B06B0A847ADEEA9D7FE4CDE49B02FB65BF3FD1C81254BBC2235560B6BAF4FDA40E4B8449AE797FAE679BEF9742A1A293FE934ED1F6D23F4EAD68C7AFA5087A34702795BEA26F82BCA28D150BE96A25E515A2449B0CF5A4A421B412729D2408114F4864336B0D0F650AA1C21739CBD0BDA3BCC5B32A96C682E213BB5407CC56E8C964FCF2FBAF27E9844861E1961E2807145A65589D70C0A5E181BCA59D61EF8281790AFA07F76C768488080000###"
}
],
"public": true,
"metadata": {
"lastUpdated": "2023-05-15T14:30:00Z",
"version": "2.1.0"
}
}
常见编程语言的JSON解析方式
JavaScript
// 解析JSON字符串
const jsonStr = '{"name":"张三","age":30}';
const obj = JSON.parse(jsonStr);
console.log(obj.name); // 输出: 张三
// 生成JSON字符串
const newObj = {name: "李四", hobbies: ["旅行", "摄影"]};
const jsonString = JSON.stringify(newObj);
console.log(jsonString); // 输出: {"name":"李四","hobbies":["旅行","摄影"]}
Python
import json
# 解析JSON字符串
json_str = '{"name": "张三", "age": 30}'
data = json.loads(json_str)
print(data["name"]) # 输出: 张三
# 生成JSON字符串
new_data = {"name": "李四", "hobbies": ["旅行", "摄影"]}
json_string = json.dumps(new_data, ensure_ascii=False)
print(json_string) # 输出: {"name": "李四", "hobbies": ["旅行", "摄影"]}
# 处理包含中文时,建议使用ensure_ascii=False参数
Java
import org.json.JSONObject;
import org.json.JSONArray;
public class JsonExample {
public static void main(String[] args) {
// 解析JSON字符串
String jsonStr = "{\"name\":\"张三\",\"age\":30}";
JSONObject obj = new JSONObject(jsonStr);
System.out.println(obj.getString("name")); // 输出: 张三
// 生成JSON字符串
JSONObject newObj = new JSONObject();
newObj.put("name", "李四");
newObj.put("age", 25);
JSONArray hobbies = new JSONArray();
hobbies.put("旅行");
hobbies.put("摄影");
newObj.put("hobbies", hobbies);
System.out.println(newObj.toString());
// 输出: {"name":"李四","age":25,"hobbies":["旅行","摄影"]}
}
}
C#
using System;
using System.Text.Json;
class Program
{
static void Main()
{
// 解析JSON字符串
string jsonStr = "{\"name\":\"张三\",\"age\":30}";
var obj = JsonSerializer.Deserialize
Console.WriteLine(obj.Name); // 输出: 张三
// 生成JSON字符串
var newObj = new Person
{
Name = "李四",
Age = 25,
Hobbies = new[] { "旅行", "摄影" }
};
string jsonString = JsonSerializer.Serialize(newObj);
Console.WriteLine(jsonString);
// 输出: {"Name":"李四","Age":25,"Hobbies":["旅行","摄影"]}
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string[] Hobbies { get; set; }
}
PHP
// 解析JSON字符串
$jsonStr = '{"name":"张三","age":30}';
$data = json_decode($jsonStr);
echo $data->name; // 输出: 张三
// 生成JSON字符串
$newData = array(
"name" => "李四",
"hobbies" => array("旅行", "摄影")
);
$jsonString = json_encode($newData);
echo $jsonString; // 输出: {"name":"李四","hobbies":["旅行","摄影"]}
// 处理中文不转义
$jsonString = json_encode($newData, JSON_UNESCAPED_UNICODE);
?>
Go
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Hobbies []string `json:"hobbies,omitempty"`
}
func main() {
// 解析JSON字符串
jsonStr := `{"name":"张三","age":30}`
var p Person
err := json.Unmarshal([]byte(jsonStr), &p)
if err != nil {
panic(err)
}
fmt.Println(p.Name) // 输出: 张三
// 生成JSON字符串
newP := Person{
Name: "李四",
Age: 25,
Hobbies: []string{"旅行", "摄影"},
}
jsonData, err := json.Marshal(newP)
if err != nil {
panic(err)
}
fmt.Println(string(jsonData))
// 输出: {"name":"李四","age":25,"hobbies":["旅行","摄影"]}
}
JSON使用最佳实践
保持结构一致性:相同类型的数据应使用相同的结构
避免过度嵌套:深度嵌套的JSON难以理解和维护
使用有意义的键名:键名应清晰描述其表示的数据
处理特殊字符:确保字符串中的特殊字符被正确转义
考虑数据大小:大型JSON文件可能影响性能
验证JSON数据:在解析前验证JSON格式是否正确
考虑安全性:不要直接执行来自不可信源的JSON数据
常见问题与解决方案
JSON与XML比较:
JSON更轻量,解析更快
XML支持注释、命名空间等更复杂的特性
根据需求选择合适的格式
日期时间格式:
JSON没有内置的日期类型
通常使用ISO 8601格式字符串表示,如"2023-05-15T14:30:00Z"
处理大数字:
某些语言(如JavaScript)对超大数字解析可能丢失精度
考虑使用字符串表示大数字
循环引用问题:
对象间循环引用会导致序列化失败
解决方案包括使用引用ID或打破循环
总结
JSON作为一种简洁、灵活的数据交换格式,已成为现代Web开发的基石。通过了解其基本格式、特殊数据处理方式以及各种编程语言中的解析方法,开发者可以更高效地在不同系统间传输和操作数据。无论是简单的配置信息,还是包含二进制数据的复杂结构,JSON都能提供有效的表示方法。掌握JSON的使用技巧,将极大提升开发效率和系统间的互操作性。