【备课专用】JSON的基本概念、示例、常见开发语言的解析(持续更新……)

JSON 全面解析:格式、特殊示例与多语言解析

什么是JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。JSON由Douglas Crockford在2001年提出,现已成为Web应用程序中最常用的数据交换格式之一。

JSON的主要特点包括:

  • 易于人类阅读和编写
  • 易于机器解析和生成
  • 支持复杂数据结构
  • 完全独立于语言

JSON基本格式

JSON由两种基本结构组成:

  1. 键值对集合:在各种语言中被实现为对象、记录、结构、字典、哈希表、有键列表或关联数组
  2. 有序值列表:在大多数语言中被实现为数组、向量、列表或序列

基本语法规则

  • 数据在键值对中
  • 数据由逗号分隔
  • 大括号 {} 保存对象
  • 中括号 [] 保存数组
  • 字符串必须使用双引号 "" 表示

数据类型

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<Person>(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

<?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使用最佳实践

  1. 保持结构一致性:相同类型的数据应使用相同的结构
  2. 避免过度嵌套:深度嵌套的JSON难以理解和维护
  3. 使用有意义的键名:键名应清晰描述其表示的数据
  4. 处理特殊字符:确保字符串中的特殊字符被正确转义
  5. 考虑数据大小:大型JSON文件可能影响性能
  6. 验证JSON数据:在解析前验证JSON格式是否正确
  7. 考虑安全性:不要直接执行来自不可信源的JSON数据

常见问题与解决方案

  1. JSON与XML比较

    • JSON更轻量,解析更快
    • XML支持注释、命名空间等更复杂的特性
    • 根据需求选择合适的格式
  2. 日期时间格式

    • JSON没有内置的日期类型
    • 通常使用ISO 8601格式字符串表示,如"2023-05-15T14:30:00Z"
  3. 处理大数字

    • 某些语言(如JavaScript)对超大数字解析可能丢失精度
    • 考虑使用字符串表示大数字
  4. 循环引用问题

    • 对象间循环引用会导致序列化失败
    • 解决方案包括使用引用ID或打破循环

总结

JSON作为一种简洁、灵活的数据交换格式,已成为现代Web开发的基石。通过了解其基本格式、特殊数据处理方式以及各种编程语言中的解析方法,开发者可以更高效地在不同系统间传输和操作数据。无论是简单的配置信息,还是包含二进制数据的复杂结构,JSON都能提供有效的表示方法。掌握JSON的使用技巧,将极大提升开发效率和系统间的互操作性。

posted @ 2025-05-11 16:13  leslie_xin  阅读(442)  评论(0)    收藏  举报