【备课专用】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(jsonStr);

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的使用技巧,将极大提升开发效率和系统间的互操作性。

2025-11-14 03:15:20
明日之后x肯德基联动上线!加入废土战斗,共享好滋味
3月26日817、麻鸡成鸡、鸡苗价格行情汇总