
简介这份资源是一套面向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 完整解析一份嵌套 JSONPython 标准库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_floatDecimal避免浮点误差。这个细节在处理金额类 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, encodingutf-8) as f: data json.load(f) # 直接从文件对象加载 print(type(data)) # dict 或 listencodingutf-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, encodingutf-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 数组转 CSVimport json, csv data json.loads(open(data.json, encodingutf-8).read()) with open(out.csv, w, newline, encodingutf-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_asciiTrue会把非 ASCII 字符转义。读取时其实不影响但直接看文件很痛苦。解决导出时加ensure_asciiFalse。json.dumps(data, ensure_asciiFalse, indent2)indent2让输出带缩进方便人看。读取时不需要额外参数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, encodingutf-8).read()) try: validate(instancedata, schemaschema) 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 配置都强制走一遍校验宁可启动时多花几毫秒也不让脏数据跑到运行时。希望帮到你。本文还有配套的精品资源点击获取