简介:这份资源是一套面向Java初学者与Web开发入门者的JSON完整示例工程,围绕JSON语法、解析与生成展开,帮助读者理解键值对、数组、嵌套对象等核心结构,并掌握在代码中处理JSON数据的常见方式。压缩包共22个文件,约2.88MB,以14个jar依赖包为主,辅以2个java源码、2个class编译文件及classpath、project等工程配置,另附1份json笔记,整体构成可直接导入运行的JsonDemo项目,依赖涵盖json-lib、commons系列等常用库。目前已有3576人学习下载,适合需要对照示例理解JSON序列化与反序列化流程的开发者。通过源码与笔记,读者可快速掌握JSON对象构建、字符串转换及依赖配置思路,为接口数据交换与AJAX场景打下基础。
1. 从一份“json完整例子”说起:为什么你搜到的 JSON 教程总是跑不通
你搜“json完整例子”,大概率不是想听 JSON 是什么——全称 JavaScript Object Notation,一种轻量级数据交换格式,这你早知道了。你真正卡住的是:拿到一份 JSON 文件,不知道用什么打开、怎么解析、字段怎么取、嵌套数组怎么遍历、格式错了怎么排查。更具体一点,你可能正在做接口联调、配置视频源、处理大模型返回的 JSON 字段,或者被一个 merge conflict 卡了半天。
这份“json完整例子”资源的价值就在这:它不是概念科普,而是一组可直接运行的完整示例,覆盖对象、数组、嵌套结构、类型边界和常见解析场景。适合三类人:刚接触接口开发的新手,需要一份能照着敲的模板;做数据处理的工程师,想快速验证解析逻辑;以及被 JSON 格式问题反复折腾、想搞清边界的人。下面我按“先看懂结构、再动手解析、最后避坑”的顺序拆开讲。
2. JSON 结构拆解:对象、数组与嵌套到底怎么组织
2.1 六种值类型与三种结构形态
JSON 的值类型只有六种:字符串、数字、布尔、null、对象、数组。前四种是标量,后两种是容器。所有复杂的 JSON 都是这六种类型嵌套组合出来的。理解这一点,后面解析时遇到任何结构都不会慌。
对象用花括号{}包裹,内部是键值对,键必须是双引号字符串,值可以是任意类型。数组用方括号[]包裹,元素可以是任意类型,且允许混合。嵌套就是容器里再放容器。常见做法是:对象表示一条记录,数组表示一批记录,嵌套对象表示关联信息。
{ "id": 1001, "name": "示例资源", "active": true, "tags": ["json", "tutorial", "example"], "meta": { "author": "engineer", "version": 2, "published": null }, "items": [ { "sku": "A1", "price": 19.9, "stock": 3 }, { "sku": "B2", "price": 5.0, "stock": 0 } ] }这段结构里,tags是字符串数组,meta是嵌套对象,items是对象数组。解析时最容易出错的地方是:把items当成对象去取键,或者遍历meta时忘了它是对象不是数组。判断方法很简单——看外层是{}还是[],{}用键访问,[]用索引或循环。
2.2 用 Python 完整解析一份嵌套 JSON
Python 标准库json就够用,不需要额外装包。下面这段代码把上面的结构解析出来,并演示三种取值方式。
import json raw = ''' { "id": 1001, "name": "示例资源", "tags": ["json", "tutorial"], "meta": {"author": "engineer", "version": 2}, "items": [ {"sku": "A1", "price": 19.9, "stock": 3}, {"sku": "B2", "price": 5.0, "stock": 0} ] } ''' data = json.loads(raw) # 字符串转字典 print(data["name"]) # 直接取标量 print(data["meta"]["author"]) # 嵌套对象逐层取 for item in data["items"]: # 数组用循环 if item["stock"] > 0: print(item["sku"], item["price"])json.loads()把字符串转成 Python 字典,如果是从文件读就用json.load(open(...))。取值时data["meta"]["author"]是逐层下钻,中间任何一层键不存在都会抛KeyError。遍历数组用for,不要用data["items"][0]硬编码索引,除非你确定只有一条。item["stock"] > 0这种判断在过滤有效数据时很常用,比如筛掉无库存的记录。
参数上唯一需要注意的是json.loads的parse_float和parse_int,默认转成 Python 的 float 和 int。如果价格字段精度要求高,可以传parse_float=Decimal,避免浮点误差。这个细节在处理金额类 JSON 时是血泪经验。
2.3 用 JavaScript 解析并处理数组过滤
前端或 Node 环境里,JSON.parse()是标配。下面演示解析后过滤出有库存的商品,并转成新数组。
const raw = `{"items":[{"sku":"A1","price":19.9,"stock":3},{"sku":"B2","price":5.0,"stock":0}]}`; const data = JSON.parse(raw); // 字符串转对象 const available = data.items.filter( // 过滤有库存的 item => item.stock > 0 ); available.forEach(item => { console.log(`${item.sku} 价格 ${item.price}`); });JSON.parse()遇到格式错误会直接抛SyntaxError,不会返回部分结果。filter返回新数组,不改变原数据。forEach只做遍历,需要返回新数组时用map。这里容易翻车的是模板字符串里再嵌 JSON 字符串,反引号和双引号混用会导致解析失败,建议 JSON 部分单独用单引号或转义。
3. 从文件到接口:JSON 读取、查询与转换的完整链路
3.1 读取本地 JSON 文件的三种方式
不同场景读文件的方式不一样。Python 读本地文件最直接:
import json with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) # 直接从文件对象加载 print(type(data)) # dict 或 listencoding="utf-8"必须显式写,否则在部分系统上中文会乱码。如果文件很大,json.load会一次性读进内存,几百 MB 以上建议用ijson流式解析。判断文件是对象还是数组,看开头第一个非空白字符是{还是[。
Node 环境读文件:
const fs = require("fs"); const data = JSON.parse( fs.readFileSync("data.json", "utf-8") ); console.log(Array.isArray(data));readFileSync是同步读,适合启动时加载配置。接口服务里建议用fs.promises.readFile异步读,避免阻塞。Array.isArray用来判断顶层是数组还是对象,决定后续用循环还是取键。
3.2 JSON 查询:按字段筛选与嵌套取值
“json查询函数”是高频搜索词,很多人想要的是类似 SQL 的查询能力。Python 里没有内置 JSON 查询语法,但可以用列表推导和filter组合实现。
import json data = json.loads(open("data.json", encoding="utf-8").read()) # 查询 stock 大于 0 且 price 小于 20 的记录 result = [ item for item in data["items"] if item["stock"] > 0 and item["price"] < 20 ] print(result) # 提取所有 sku 组成新列表 skus = [item["sku"] for item in data["items"]] print(skus)列表推导里if可以写多个条件,用and连接。提取字段用[item["sku"] for item in ...],这是最常用的投影操作。如果嵌套层级深,比如data["meta"]["author"],建议先赋值给中间变量,避免重复下钻和潜在KeyError。
需要更复杂的查询时,常见做法是用jmespath或jsonpath-ng,语法类似items[?stock > \0`].sku`。但引入第三方库前先确认标准库能不能满足,多数筛选场景列表推导就够了。
3.3 JSON 转其他格式:CSV、TXT 与掩码处理
“json转txt掩码”这类需求通常出现在数据导出场景。把 JSON 数组转 CSV:
import json, csv data = json.loads(open("data.json", encoding="utf-8").read()) with open("out.csv", "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=["sku", "price", "stock"]) writer.writeheader() for item in data["items"]: writer.writerow(item)DictWriter要求每行是字典,fieldnames决定列顺序。newline=""防止 Windows 下多空行。如果 JSON 字段比 CSV 列多,只写fieldnames里列出的键,多余的自动忽略。转 TXT 掩码时,通常是把敏感字段替换成固定字符:
masked = [ {**item, "sku": item["sku"][:2] + "***"} for item in data["items"] ]{**item, "sku": ...}是浅拷贝并覆盖字段,不修改原数据。掩码规则按业务定,常见是保留前两位、其余替换。
4. 避坑与排查:JSON 解析中最容易翻车的五个场景
4.1 现象:解析报JSONDecodeError,但肉眼看着格式没错
原因通常有三类:末尾多了逗号、用了单引号、键没加双引号。JSON 标准不允许尾逗号,不允许单引号字符串,键必须双引号。肉眼扫一遍很难发现,尤其是长文件。
解决:用在线校验工具或命令行python -m json.tool data.json,它会指出具体行号。VS Code 里装 JSON 插件也能实时标红。养成保存前格式化一次的习惯,能省很多排查时间。
4.2 现象:中文显示成\u4e2d\u6587转义序列
原因:json.dumps默认ensure_ascii=True,会把非 ASCII 字符转义。读取时其实不影响,但直接看文件很痛苦。
解决:导出时加ensure_ascii=False。
json.dumps(data, ensure_ascii=False, indent=2)indent=2让输出带缩进,方便人看。读取时不需要额外参数,json.load会自动还原转义。
4.3 现象:大整数或高精度小数解析后精度丢失
原因:JavaScript 的JSON.parse把所有数字转成双精度浮点,超过 2^53 的整数会丢精度。Python 默认 int 不丢,但 float 有浮点误差。
解决:金额类字段在 JSON 里用字符串存,解析后按需转Decimal。大整数 ID 同样建议用字符串。这是接口设计阶段就要定的规则,事后补救很麻烦。
4.4 现象:merge conflict 时 JSON 文件冲突无法自动合并
原因:JSON 是纯文本,Git 按行合并,两个分支同时改同一段结构就会冲突。如果格式化风格不一致(一个缩进 2 空格一个 4 空格),整个文件都会冲突。
解决:团队统一格式化工具,比如 Prettier 配.prettierrc,提交前跑一遍。冲突时不要手动删括号,用git checkout --theirs或--ours先选一边,再手动补差异。结构复杂的 JSON 建议拆成多个小文件,降低冲突概率。
4.5 现象:接口返回的 JSON 里字段有时是对象有时是数组
原因:后端设计不一致,或者空结果时返回{}而非[]。前端按数组遍历就会报错。
解决:解析后先判断类型再处理。
const items = Array.isArray(data.items) ? data.items : [];这行兜底能避免大部分运行时错误。更根本的办法是推动接口规范统一,空数组返回[],空对象返回{},不要混用。
5. 进阶技巧:用 JSON Schema 校验结构,把错误挡在解析之前
前面讲的都是解析后处理,但更高效的做法是解析前先校验。JSON Schema 就是干这个的——它用一份 JSON 描述另一份 JSON 应该长什么样,字段类型、必填项、取值范围都能约束。常见做法是在接口入口或配置文件加载时先跑一遍校验,不合格直接拒绝,避免脏数据流到下游。
Python 里用jsonschema库:
import json from jsonschema import validate, ValidationError schema = { "type": "object", "required": ["id", "name", "items"], "properties": { "id": {"type": "integer"}, "name": {"type": "string"}, "items": { "type": "array", "items": { "type": "object", "required": ["sku", "price"], "properties": { "sku": {"type": "string"}, "price": {"type": "number", "minimum": 0} } } } } } data = json.loads(open("data.json", encoding="utf-8").read()) try: validate(instance=data, schema=schema) print("校验通过") except ValidationError as e: print("校验失败:", e.message)required列出必填字段,缺一个就报错。type约束类型,minimum约束数值下限。items嵌套 schema 可以逐层校验数组元素。ValidationError的message会指出具体哪个字段不满足,排查很快。
参数上,validate默认遇到第一个错误就停,想看全部错误用iter_errors。schema 本身也可以存成独立 JSON 文件,用json.load读进来,方便版本管理。
| 校验项 | 关键字 | 作用 |
|---|---|---|
| 必填 | required | 字段缺失即报错 |
| 类型 | type | 限定 string/number/object 等 |
| 数值范围 | minimum / maximum | 限定数字上下限 |
| 字符串长度 | minLength / maxLength | 限定字符数 |
| 数组元素 | items | 对每个元素套用子 schema |
这张表覆盖了日常八成校验需求。更复杂的还有oneOf、anyOf、pattern,按需查文档即可。
我现在的习惯是:任何外部来源的 JSON,不管是接口返回还是配置文件,进业务逻辑前先过一遍 schema。有一次线上事故就是配置文件里port写成了字符串"8080",解析没报错但后续拼接 URL 时出了玄学问题,查了两小时。从那以后我每次加载 JSON 配置都强制走一遍校验,宁可启动时多花几毫秒,也不让脏数据跑到运行时。希望帮到你。
本文还有配套的精品资源,点击获取