JSON:从数据到文本的“翻译”艺术
JSON是什么?——数据的“通用语言”
在聊“JSON是怎么做成的”之前,先得明白JSON是什么,全称是“JavaScript Object Notation”(JavaScript对象表示法),它是一种轻量级的数据交换格式,简单说,JSON就像数据的“翻译官”,能把复杂的数据结构(比如对象、数组、列表)转换成人类可读、机器易处理的文本格式,让不同系统(比如Java后端和前端网页)能“无障碍对话”。
想象一下:你用手机App点外卖,App需要从服务器获取菜品信息——服务器不会直接把数据库里的“二进制数据”扔给你,而是用JSON把数据“翻译”成文本,
{ "dishName": "宫保鸡丁", "price": 32, "tags": ["辣", "下饭菜"], "restaurant": { "name": "川味小厨", "rating": 4.5 } }
这段文本就是JSON,前端App拿到后,能轻松“看懂”并展示在界面上,这个“翻译”过程——也就是JSON的“制作过程”——到底是怎么实现的呢?
JSON的“制作原料”:数据结构是基础
JSON不是凭空生成的,它的核心是对“数据结构”的封装,任何要变成JSON的数据,本质上都必须是计算机可识别的结构化数据,常见原料包括:
键值对(Key-Value Pair)
这是JSON最核心的“砖块”,键(Key)是字符串(必须用双引号包裹),值(Value)可以是多种类型,
- 简单值:字符串(
"张三"
)、数字(25
)、布尔值(true
/false
)、空值(null
); - 复杂值:数组(
[]
)、对象()。
对象(Object)
用花括号包裹,多个键值对组合而成,表示“一个实体”,比如上面例子中的"restaurant"
就是一个对象,包含"name"
和"rating"
两个键值对。
数组(Array)
用方括号[]
包裹,多个值(可以是简单值、对象或数组)组合而成,表示“一组有序数据”,比如"tags": ["辣", "下饭菜"]
就是一个数组,存放了菜品标签。
关键规则:这些原料必须“整齐”——键必须是字符串(双引号),值类型要明确,不能混用(比如数字不能加引号变成字符串,除非是文本形式的数字)。
JSON的“制作流程”:从内存到文本的“两步走”
要把数据变成JSON,本质上是一个“序列化”(Serialization)过程——即把内存中的数据结构(比如Python的字典、Java的Map、JavaScript的对象)转换成JSON格式的文本字符串,这个过程通常分两步:数据准备 → 格式化转换。
第一步:数据准备——整理成“JSON兼容结构”
不同编程语言中,数据结构的“名字”不同(比如Python叫“字典”,JavaScript叫“对象”,Java叫“Map”),但本质都是“键值对集合”,制作JSON前,需要把这些语言原生数据结构转换成JSON能识别的“通用结构”:
-
Python:用字典和列表
[]
组合。dish_data = { "dishName": "宫保鸡丁", "price": 32, "tags": ["辣", "下饭菜"], "restaurant": { "name": "川味小厨", "rating": 4.5 } }
这个字典结构已经和JSON的“对象”高度一致,可以直接进入下一步。
-
JavaScript:用对象和数组
[]
。let dishData = { dishName: "宫保鸡丁", price: 32, tags: ["辣", "下饭菜"], restaurant: { name: "川味小厨", rating: 4.5 } };
注意:JavaScript对象的键可以不加引号(但JSON规范要求必须加,后续转换时会自动处理)。
-
Java:用
Map
、List
或第三方库(如Jackson、Gson)的实体类,比如用Map
:Map<String, Object> dishData = new HashMap<>(); dishData.put("dishName", "宫保鸡丁"); dishData.put("price", 32); dishData.put("tags", Arrays.asList("辣", "下饭菜")); Map<String, Object> restaurant = new HashMap<>(); restaurant.put("name", "川味小厨"); restaurant.put("rating", 4.5); dishData.put("restaurant", restaurant);
Java是强类型语言,需要把数据统一封装成
Object
类型,才能放入Map
中。
第二步:格式化转换——用“JSON工具”生成文本
准备好数据结构后,就需要“转换器”把它变成JSON字符串,几乎所有编程语言都内置了JSON处理库,或提供了成熟的第三方库,核心就是“序列化”方法:
-
Python:用
json
模块的dumps()
(dump to string,转字符串)方法:import json json_str = json.dumps(dish_data) print(json_str)
输出:
{"dishName": "宫保鸡丁", "price": 32, "tags": ["辣", "下饭菜"], "restaurant": {"name": "川味小厨", "rating": 4.5}}
注意:Python的
True
/False
/None
会被自动转成JSON的true
/false
/null
(首字母小写)。 -
JavaScript:用
JSON.stringify()
方法:let jsonStr = JSON.stringify(dishData); console.log(jsonStr);
输出和Python一致,且会自动处理JavaScript对象的“无引号键”,补上双引号。
-
Java:用Jackson库的
ObjectMapper
:ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(dishData); System.out.println(jsonStr);
输出相同,Jackson还能处理Java对象(实体类),自动将字段名转成JSON的键。
第三步:可选优化——格式化与编码
生成的JSON字符串默认是“紧凑型”(无多余空格和换行),如果人类需要阅读(比如调试),可以用“格式化”功能,让它更易读:
- Python:
json.dumps(dish_data, indent=2)
(indent
参数控制缩进); - JavaScript:
JSON.stringify(dishData, null, 2)
(第三个参数是缩进空格数); - Java:
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(dishData)
。
JSON文本默认使用UTF-8编码(支持多语言字符,比如中文),这也是它能成为“通用语言”的关键之一——无需担心乱码问题。
JSON的“制作规范”:这些“红线”不能碰
JSON不是随便写的,必须遵守语法规范,否则机器无法解析,核心规则包括:
- 键必须双引号:单引号()是非法的,比如
{name: "张三"}
错误,必须是{"name": "张三"}
; - 值类型要明确:字符串必须双引号,数字不能加引号(
"32"
是字符串,32
才是数字),布尔值是小写true
/false
; - 引号要成对:字符串中的双引号需用反斜杠转义(
"他说:\"你好\""
); - 结构嵌套要清晰:对象和数组可以嵌套,但必须闭合(和
[]
配对); - 末尾不能有逗号:对象最后一个键值对、数组最后一个元素后不能加逗号(比如
{"a": 1,}
错误)。
JSON的“反向操作”:从文本回数据
“制作”JSON不仅是“生成”,也包括“解析”——即把JSON文本转换回内存中的数据结构(反序列化),这个过程和制作JSON是“双向”的:
- Python:
json.loads(json_str)
→ 转回字典; - JavaScript:
let obj = JSON.parse(jsonStr)
→ 转回对象; - Java:
Map<String, Object> obj = mapper.readValue(jsonStr, Map.class)
→ 转回Map
。
JSON的“制作”本质是“数据结构的文本化”
从原料(数据结构)
还没有评论,来说两句吧...