企评社

라벨은 한국어(으)로 표시됩니다. 기업 리뷰, 게시판, 도구 설명은 현재 중국어로만 제공됩니다.

JSON 도구

정렬·압축·위치 검증·키 정렬·이스케이프·CSV 변환의 여섯 조작이 하나의 입력을 공유합니다. 한 곳만 고쳐도 오가며 시험할 수 있습니다

JSON 只在你的浏览器里处理,不上传、不留存
本工具只接受严格 JSON(RFC 8259)。 不支持注释(// 与 /* */)、单引号字符串、尾随逗号、NaN / Infinity、以及未加引号的对象键——这些都是 JSON5 或 JavaScript 对象的写法,不是 JSON 标准的一部分,解析器拒绝它们是正确行为。本页不提供"宽松模式":把非法输入偷偷"修好"会让你以为数据入库时也会通过,风险比报错大得多。

입력

粘贴 JSON,或点右侧按钮填入示例

操作

格式化只做「重新排版」,不会改变值的类型,也不会给键排序——取消勾选「保留键的原始顺序」才会按键名重排(与「键排序」一致)。输出会给出字符数与行数。

결과

JSON 格式化、校验与转 CSV 里最容易踩的几件事

严格 JSON 的语法其实只有几页纸,但报错信息几乎没法读。RFC 8259 定义的 JSON 只有六种结构:对象 { }、数组 [ ]、字符串、数字、布尔值 true / false、以及 null。对象必须是「字符串键 + 冒号 + 值」,键必须用双引号;数组元素之间必须用逗号分隔,且最后一项后面不能再有逗号;字符串里除了少数字符外都不能直接出现控制字符。规范很短,可浏览器和多数语言抛出的错误却只是「Unexpected token } in JSON at position 42」——它只说第 42 个字符处出了意外,不告诉你第 42 个字符在第几行。本页做的就是把那个字符位置换算成「第 X 行第 Y 列」,同时在输入框里选中出错位置,让你一眼看到问题在哪。

尾随逗号、注释、单引号为什么必须报错。这是三个最常见的「看起来没问题」的写法:{ "a": 1, }(尾随逗号)、// 说明 或 /* 说明 */(注释)、{ 'a': 1 }(单引号)。它们全都是 JSON5 或 JavaScript 对象字面量的扩展,不是 JSON。JSON 的设计目标之一是「用极小的解析器就能正确读出」,因此它刻意不允许这些方便写法:注释会让同一份数据在没有注释语法的解析器里直接失败,尾随逗号会让「按逗号切分再逐段解析」的流式解析器多出一个空段。更麻烦的是,很多 JavaScript 环境(包括浏览器控制台、eval、以及 JavaScript 配置文件)会接受它们,于是同一段文本在本地「没问题」、发到服务端或换个语言解析时就炸。本页站在严格 JSON 这一边:宁可现在报错,也不要让它到生产环境才暴露。同样地,NaN 与 Infinity 在 JSON 里也不是合法值——需要表达「非数」时请用 null 或字符串。

格式化与压缩各自解决什么问题。格式化(缩进 2 空格 / 4 空格 / Tab)是为了给人看:代码评审、配置比对、排查层级关系。这里有一个容易被忽略的细节——格式化不应该改变键的顺序。有些工具会顺手把键按字母排序,看起来整齐,但「字段顺序」在不少场景下是有意义的(日志字段的自然阅读顺序、接口文档的示例顺序、以及对比两份文件的差异),悄悄重排会让 diff 噪点暴增。本页默认保留原始顺序,需要排序时请显式点「键排序」。压缩(minify)则是为了给机器传:去掉缩进与换行后体积通常能小两三成,放进请求体、环境变量或配置文件里更省事。注意压缩只删「结构上的空白」,字符串内部的空格与换行会被完整保留,所以压缩后解析出来的数据与压缩前完全等价。

转 CSV 的坑几乎全在「值里有逗号、引号、换行」和「编码」上。CSV 看起来很土,但它有一个所有表格软件都认的正式规范 RFC 4180。规范里真正的难点只有一条:当某个单元格里出现逗号、双引号或换行时,必须用双引号把整格包起来,并把格内的每个双引号写成两个。少了这一步,一个地址里的逗号就会把整行拆歪;多写一层引号又会多出真实的引号字符。另外三件事同样常见:① 表头要取所有对象的键的并集(接口返回的数组里,元素往往不是每个都有全部字段),缺字段的位置留空而不是错位;② Excel 在简体中文 Windows 上双击打开无 BOM 的 CSV 时会按本地代码页解读,中文直接乱码,因此本页默认在文件开头写入 UTF-8 BOM;③ 数字与文本的界线——CSV 没有类型,007 与 7 到了表格里都会被当数字,需要保留前导零时得在导出前把它变成带引号的文本。本页严格按 RFC 4180 处理这三类字符,嵌套对象与数组会写成一格紧凑 JSON,而不是被压平成多列(压平会丢失结构与层级信息,宁可让你再处理一次)。

为什么不上传到服务器。JSON 是最容易夹带敏感内容的格式:接口返回里可能有 token、数据库配置、内网地址、用户的手机号与身份证号,运维配置文件里往往还有密钥。把这样一段文本粘进一个在线格式化工具,如果它在服务端解析,你就等于把凭证复制了一份给第三方——而且很多站点的"历史记录"会把它留在数据库里。本工具的全部逻辑(解析、定位、排序、转义、转 CSV)都是运行在你浏览器内的一段纯 JavaScript 函数,写在页面的 PURE 区块里,可以用开发者工具的 Sources 面板逐行读完;整页没有任何提交请求,也没有写入 localStorage 或 cookie 的历史记录。断网状态下刷新页面,它照样能用。

자주 묻는 질문

오류에 'position 42' 라고 뜨는데, 몇 줄이에요?

position 은 0 번 글자부터 센 글자 위치예요 (V8 은 UTF-16 코드 단위로 셉니다: 중국어·전각 문장부호는 1, 이모지 등 보조사면 문자는 2) — 줄 번호가 아니죠. 이 페이지는 그것을 줄·칸으로 바꿔 주고 앞뒤 문맥도 살짝 보여 줘요 (예: '3 줄 15 칸 근처: "age": ,'). 입력칸에서도 그 자리를 선택해서 자동으로 굴러가요. 어떤 브라우저는 오류에 position 을 안 실어 오는데, 그럴 땐 이 페이지가 솔직히 '위치는 못 짚지만, 이건 타당한 JSON 이 아니에요' 라고만 써요 — **위치를 지어내진 않아요**.

쉼표 하나·주석 하나에 왜 안 돼요? 다른 도구는 되는데요.

그쪽은 느슨한 해석(JSON5, JSONC, 아예 eval)을 쓰거든요. 편하긴 한데, 같은 글자가 파이썬 json.loads, 자바 Jackson, 고(golang) encoding/json 에서는 다 실패하는 게 결과예요 — 데이터베이스 쓰기, 게이트웨이 전달, 메시지큐 소비가 그 순간 끊기죠. 이 페이지가 엄격한 RFC 8259 를 고수하는 건 올린 뒤가 아니라 **붙여넣는 이 순간**에 알게 하려는 거예요. 참고로 VS Code settings.json, TypeScript tsconfig.json 이 주석을 허용하는 건 표준 JSON 이 아니라 JSONC(JSON with Comments)를 읽기 때문이에요.

정리하면 큰 숫자 정밀도 날아가요?

입력 자체가 이미 자바스크립트 정밀도 한계를 벗어났는지에 달려요. JSON.parse 는 숫자를 IEEE 754 배정밀도 실수로 풀기 때문에, 2 의 53 승 넘는 정수 (일부 snowflake ID, 19 자리 주문번호 같은 것) 는 해석하는 순간 이미 찌그러져요 — 그다음 정리해도 찌그러진 채이고, 이 페이지도 되돌릴 수 없어요. 이런 경우는 API 가 ID 를 문자열로 돌려주게 하세요. 그리고 정리·압축은 자리배치만 고치는 거라, 1.0 이 1 말고 다른 값이 되지도 않고 순서도 안 바뀌어요 ('키 정렬' 을 직접 누를 때만 제외).

CSV 로 내보낼 때 꼭 맨위가 배열이어야 하는 건 왜죠? 객체는요?

CSV 는 2 차원 표라 한 줄이 한 기록 — '모양 같은 기록들의 묶음' 이 필요하거든요. 맨위가 객체면 (예: { "total": 3, "rows": [ ... ] }) 이 페이지는 못 한다고 분명히 알려요 — 어느 필드를 내보내려 했는지 **임의로 짐작하지 않아요**: 잘못 맞추면 눈치도 못 채기 쉬워요. 맞는 방법은 내보낼 배열을 꺼내서 다시 붙여넣는 거예요. 같은 이치로 배열 안에 숫자·문자열 섞이거나 요소가 다 객체가 아니면 거부하고 이유도 알려줘요.

내보낸 CSV 를 엑셀로 열면 숫자가 지수표기·날짜로 변해요.

그건 CSV 문제 아니고 엑셀 자동 형식 짐작 때문이에요: 18 자리 숫자는 1.2E+17 이 되고, 2024-01-05 같은 글자는 날짜로 읽혀요. CSV 규격엔 '형식' 개념이 없어서 이 도구도 엑셀을 못 말려요. 확실한 방법: 그대로 둘 긴 숫자 (주문번호·주민번호) 은 내보낸 뒤 엑셀에서 그 열을 '텍스트' 로 지정하고 다시 들이세요 (또는 '데이터 - 텍스트/CSV 에서' 마법사에서 해당 열을 텍스트로 지정). 이 페이지 기본 UTF-8 BOM 은 중국어 깨짐만 잡고 형식 짐작엔 못 써요.

관련 도구