JSON 排序
免費線上 JSON 排序工具,一鍵把 JSON 物件的鍵名按字母序排列,或對陣列元素按值排序,可切換升序/降序、是否遞迴巢狀。
相關推薦
什麼是 JSON 排序(JSON Sort)?
JSON 排序(JSON Sort)是把 JSON 物件內的鍵名按某種順序(最常見是字母序)重新排列,或把 JSON 陣列的元素按某種規則(數字大小、字串字典序)重排。它不會改變任何欄位值或欄位類型,只是把「物理順序」統一,讓不同來源、不同時間、不同開發者產生的 JSON 在結構上完全對齊——這是一種典型的正規化(canonicalization)操作。
工程實踐中需要 JSON 排序的 5 大原因:① **減少 Git Diff 噪音**——不同開發者用不同順序構造的 JSON 物件提交時會生成大量無意義 diff,統一鍵名順序後 diff 聚焦在真正變更的欄位;② **設定正規化**——CI/CD 管線、設定中心、Feature Flag 服務希望所有環境設定鍵名順序一致,便於稽核、回滾、跨環境 diff;③ **資料對比**——用 JSON Diff 工具比較兩個 JSON 前先排序,能消除「鍵名順序不同」造成的假差異;④ **API 響應標準化**——前端對響應做快取或算 hash 時希望鍵名順序穩定,避免相同業務資料因鍵序不同被識別為不同 key;⑤ **可讀性**——手工構造的 JSON 經常是按業務邏輯新增欄位的,排序後視覺上更整齊。
實現層面,JSON 排序的核心是對每一層物件的鍵按 `localeCompare` 排序,遞迴處理巢狀物件。GeekFormat 的 JSON 排序工具內建兩種模式:① **按鍵名排序**(預設):只對物件鍵名按字母順序重排,保持陣列元素順序;② **按陣列元素排序**:把陣列內的元素按序列化後的字串字典序排序。同時支援遞迴開關、升序/降序切換。整個過程在瀏覽器本地完成,不上傳任何內容。
適用場景
- 統一團隊 JSON 設定檔、package.json、tsconfig.json 等的鍵名順序,減少 Git Diff 噪音
- 對比兩個 JSON 前先排序,消除鍵順序不同造成的假差異,讓 diff 聚焦在真正變更
- API 響應資料正規化鍵名順序,方便前端快取、IndexedDB 儲存、物件 hash 計算
- CI/CD 設定中心、Feature Flag 服務的設定按規範鍵序落盤,便於稽核和回滾
- 整理大型 JSON 設定檔或資料匯出檔案,按字母序排列鍵名後視覺更整齊
- 在把 JSON 寫入資料庫 / Redis / 訊息佇列前統一鍵名順序,保證下游消費冪等
使用方法
- 把需要排序的 JSON 內容貼到左側輸入框,或點擊「範例」載入一個典型多層級 JSON,或上傳 .json/.txt 檔案
- 在底部選項欄中選擇排序模式:預設「按鍵名排序」;如需對陣列內元素排序,切換到「按陣列排序」
- 根據需要切換升序 / 降序按鈕,勾選或取消「遞迴」選項(預設開啟)
- 點擊「排序」按鈕,右側輸出框會顯示排序後的格式化結果;點擊「複製」或「下載」儲存為 sorted.json
功能特點
- 兩種排序模式:支援「按物件鍵名排序」和「按陣列元素排序」兩種核心模式,可一鍵切換
- 遞迴巢狀處理:預設開啟遞迴,深入多層巢狀物件對每一層級都做鍵名排序,確保結構整齊一致
- 升序/降序切換:內建升序(A-Z)/ 降序(Z-A)切換按鈕,靈活適配閱讀習慣和業務要求
- localeCompare 字典序:鍵名比較使用本地字典序,對中文、特殊字元、emoji 都能正確排序
- 保留資料結構:只調整鍵名順序與陣列元素順序,不增刪任何欄位、不修改值類型
- 範例資料快速體驗:內建「動物園 + alpha/beta/omega」示範資料,一鍵載入即可看到排序效果
- 本地處理保護隱私:解析、排序、格式化全部在瀏覽器本地完成,輸入內容不發送到任何伺服器
- 無縫銜接下游:排序結果可一鍵複製到 JSON 格式化、Diff 對比、Schema 校驗等工具中繼續處理
程式碼範例
使用 JavaScript Object.keys + sort 排序物件鍵名
javascript// 按鍵名遞迴排序, 返回新物件(不修改原物件)
function sortKeysDeep(value) {
if (Array.isArray(value)) return value.map(sortKeysDeep);
if (value !== null && typeof value === 'object') {
return Object.keys(value)
.sort((a, b) => a.localeCompare(b))
.reduce((acc, k) => {
acc[k] = sortKeysDeep(value[k]);
return acc;
}, {});
}
return value;
}
const data = { zoo: { animals: ['zebra', 'elephant'] }, alpha: 1, beta: 2 };
const sorted = sortKeysDeep(data);
console.log(JSON.stringify(sorted, null, 2));
// => {
// "alpha": 1,
// "beta": 2,
// "zoo": { "animals": ["zebra", "elephant"] }
// }使用 Python sort_keys=True 排序 + 陣列排序
pythonimport json
data = {"zoo": {"animals": ["zebra", "elephant"]}, "alpha": 1, "beta": 2}
# 序列化時按 sort_keys 自動按字母序排
sorted_json = json.dumps(data, indent=2, sort_keys=True, ensure_ascii=False)
print(sorted_json)
# 陣列按值排序
arr = [3, 1, 4, 1, 5, 9, 2, 6]
print(sorted(arr)) # 數字升序
print(sorted(arr, reverse=True)) # 降序
# 字串字典序
print(sorted(['banana', 'Apple', 'cherry'])) # ['Apple', 'banana', 'cherry']使用 jq 按鍵名排序
bash# 按鍵名遞迴排序 + 2 空格縮排 jq -S '.' data.json # 解釋: -S (--sort-keys) 把所有物件鍵按 ASCII 升序遞迴排序 # 陣列按元素字串字典序排序 (物件會按 JSON 字串比較) jq 'sort' data.json # 陣列按某個欄位排序 (例如按 age 升序) jq 'sort_by(.age)' data.json # 降序 jq 'sort_by(.age) | reverse' data.json
常見問題
JSON 排序和 JSON 格式化有什麼差別?
JSON 格式化只調整縮排、換行、空白字元,不改變鍵的順序;JSON 排序則會重新排列鍵名(按字母序)或陣列元素(按值大小)的物理順序。兩者經常配合使用:先排序讓結構整齊,再格式化讓內容易讀,最終輸出最規範的 JSON。
排序後的 JSON 體積會變大嗎?
位元組數基本不變。排序不增刪欄位,僅重排鍵名順序,序列化後字元數與原 JSON 幾乎相同(縮排字元可能有 1-2 位元組差異)。
會改變欄位值或欄位類型嗎?
不會。本工具是純結構重排:物件鍵名換序、陣列元素換位、值和類型一律不動。`null`、布林、數字、字串、物件、陣列的相對語意全部保留。
支援按值排序物件鍵嗎?
本工具當前支援兩種模式:① 按鍵名字母序排序(物件的鍵名換順序);② 按值對陣列元素排序(陣列內元素換位)。如需按物件的某個欄位值排序陣列元素,請先用 JSON Path 工具抽取該欄位到頂層陣列再用陣列模式排序。
遞迴排序是什麼意思?要不要關掉?
遞迴 = 對巢狀物件每一層級都做鍵名排序;非遞迴 = 只對最外層物件的鍵名排序,子物件保持原順序。絕大多數場景建議保持遞迴開啟,能獲得整齊一致的結構。僅當你的內層物件有特定順序語意(如設定中的「優先級列表」)時,才需要關閉遞迴。
為什麼我的 JSON 整數鍵被排到最前面?
這是 JavaScript 規範行為:當物件的鍵看起來像非負整數(0、1、2...)時,引擎會按數字升序迭代,整數鍵會排在字串鍵前面。本工具的排序結果會保留這個特性。如希望「看起來像整數的鍵也按字串順序排」,可先用 JSON 修復或編輯器把它們改為 "0"、"1" 等帶引號的字串鍵。
中文鍵名能按拼音排序嗎?
能。本工具底層使用 JavaScript 的 localeCompare,預設按當前瀏覽器的 locale 排序。中文環境下基本按拼音升序,但具體行為與瀏覽器和作業系統相關;如需嚴格 Pinyin 排序,可換用支援 ICU 排序規則的 Node.js 函式庫(如 `natural-orderby`)。
陣列裡的物件怎麼排序?
陣列模式支援把陣列裡的物件按「序列化後字串的字典序」排序,這意味著物件會按第一個不同欄位的字串值排序。如需按某個具體欄位排序(如 price、date),建議先在 JSON Path 工具中用 sort-by 類操作,或在程式碼裡用 `Array.prototype.sort((a, b) => a.price - b.price)`。
排序後能復原恢復原順序嗎?
本工具不維護原順序歷史(出於簡化考量)。建議:① 修改前先複製一份原文到剪貼簿;② 把原文儲存為 .json 檔案以便回滾;③ 在生產環境用 git 管理原始檔案,需要時可 `git checkout` 任意歷史版本。
排序後的結果可以匯出儲存嗎?
可以。點擊「下載」儲存為 sorted.json 檔案;或點擊「複製」把結果放入剪貼簿貼到程式碼、文件中。下載檔案是標準 JSON,可被任何編輯器、IDE、CI 工具消費。
工具會上傳我的 JSON 到伺服器嗎?
不會。解析、排序、格式化全部在瀏覽器本地完成,輸入與中間結果不發送到任何伺服器。可離線使用,適合處理含敏感資訊(如內部設定、未公開 API 響應)的 JSON。
和 JSON Diff、Schema 校驗配合使用的最佳順序是什麼?
推薦鏈路:① JSON 修復(清洗非法 JSON)→ ② JSON 排序(統一鍵名順序)→ ③ JSON Diff(基於排序結果做差異對比,diff 噪音最小)→ ④ JSON 格式化(統一縮排可讀性)→ ⑤ JSON Schema 校驗(業務欄位約束)。按需選擇其中幾步即可。
故障排查
排序提示 "Invalid JSON" 錯誤
原因:輸入不是合法 JSON。解決方法:先把 JSON 貼到「JSON 修復」工具清洗(自動處理尾逗號、單引號、未加引號鍵等),再回到本工具排序;或檢查是否漏寫了外層大括號 / 方括號。
排序後整數鍵被排到最前面
原因:JavaScript 規範對「看起來像非負整數」的鍵按數字升序迭代。解決方法:把整數鍵改為字串鍵("0"、"1")再排序;或接受此行為、把它視為一個特性。
陣列內物件沒按我希望的欄位排序
原因:陣列模式按「序列化後字串字典序」排序,第一個不同欄位決定最終順序。解決方法:先在 JSON Path 工具中用 sort-by 類操作;或在程式碼裡用 `arr.sort((a, b) => a.field - b.field)` 自訂比較函式;本工具主要面向鍵名排序場景。
中文鍵名排序結果不符合預期
原因:localeCompare 在不同瀏覽器/作業系統的行為略有差異,對中文預設按 Unicode 碼點或瀏覽器 locale 排序。解決方法:在程式碼中明確指定 locale(如 `localeCompare('zh-TW')`);或換用支援 ICU 排序規則的函式庫以獲得嚴格的 Pinyin 排序。
巢狀物件的內部沒排序(只外層排了)
原因:底部選項欄中的「遞迴」未勾選。解決方法:勾選「遞迴」開關(預設已勾選),重新觸發排序;這樣內層物件的鍵名也會按字母序排列。
大檔案(10 MB+)排序卡死
原因:瀏覽器一次性 JSON.parse 大文字會佔用大量記憶體。解決方法:把輸入控制在 1-2 MB 以內;在本地用 Node.js(`Object.keys(...).sort()`)或 Python(`json.dumps(..., sort_keys=True)`)腳本處理超大檔案;處理完再用本工具做小幅驗證。
術語表
- JSON Sort
- 把 JSON 物件鍵名按字母序重排,或把陣列元素按值重排;不改變任何欄位值或類型,僅重排物理順序。
- localeCompare
- JavaScript 內建的字串字典序比較函式,返回 -1/0/1;本工具用 localeCompare 對鍵名排序,對中文/特殊字元/emoji 都能正確比較。
- ASCII 升序 / 降序
- 按字元的 Unicode 碼點(ASCII 表)排序;大寫字母 A-Z 在小寫字母 a-z 之前,數字 0-9 在字母之前。
- locale-aware Sort
- 考慮語言習慣的排序;對中文預設按 Unicode 碼點或瀏覽器 locale,與嚴格的 Pinyin 排序有差異。
- 整數鍵 (Integer-like Key)
- 看起來像非負整數的物件鍵名(如 "0"、"1"、"2"),JavaScript 引擎會自動按數字升序迭代;規範行為,不可關閉。
- 遞迴排序 (Recursive Sort)
- 對巢狀物件的每一層級都做鍵名排序;本工具預設開啟,關閉後只排最外層。
- Canonical Form
- 正規化形式;JSON 排序是構造 canonical form 的一種手段,便於 diff、快取 hash、跨環境一致。
- Git Diff 噪音
- 程式碼 review 中由格式差異(而非真實邏輯變更)產生的 diff 行;鍵名順序不同的 JSON 提交會大量產生噪音 diff。
- pre-commit Hook
- Git 提交前自動執行的勾點腳本;很多團隊在 pre-commit 裡呼叫 `jq -S .` 把 JSON 檔案鍵名排序後再 add,保證倉庫內 JSON 順序一致。
- JSON Diff 工具
- 對比兩個 JSON 找出差異的工具(如 jsondiffpatch);建議先對兩邊 JSON 排序再 diff,能消除鍵名順序造成的假差異。
JSON 排序場景與排序方法對照表
| 場景 | 排序依據 | 推薦實作 | 對應工具 |
|---|---|---|---|
| 減少 Git Diff 噪音 | 物件鍵名字母序 | jq -S | 本工具 / jq |
| 設定中心正規化 | 物件鍵名字母序 | jq -S | 本工具 / jq |
| API 響應快取鍵 | 物件鍵名字母序 | JSON.stringify(sort_keys=True) | 本工具 / Python json |
| 分頁 API 陣列合併 | 不排序 | concat | JSON Merge 工具 |
| 按建立時間排陣列成員 | 陣列元素 .created_at | jq 'sort_by(.created_at)' | jq sort_by |
| 按價格排商品 | 陣列元素 .price | lodash _.sortBy | JS sort((a,b)=>a.price-b.price) |
JSON 排序 vs JSON Diff vs JSON Merge
| 工具 | 解決什麼問題 | 排序維度 | 通常配套使用 |
|---|---|---|---|
| JSON 排序(本工具) | 統一鍵名/陣列順序 | 鍵名 / 陣列元素 | JSON Diff、JSON Merge |
| JSON Diff | 對比兩個 JSON 找差異 | 無(基於內容比較) | 排序(先排序再 diff) |
| JSON Merge | 多源合併 | 可按需排序合併 | 排序(合併後排序歸一) |
| JSON 修復 | 把非法 JSON 轉為合法 | 無 | 排序(修復後排序歸檔) |
| JSON Schema 校驗 | 欄位約束校驗 | 無 | 可基於排序後結果校驗 |
Authoritative References
- JSON 壓縮
- CSV 轉 JSON
- JSON 轉 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON 扁平化
- JSON 格式化
- JSON 產生器
- JSONPath 查詢
- JSON 合併
- JSON 修復
- JSON Schema 驗證器
- JSON 排序
- JSON Stringify
- JSON 轉 HTML 表格
- JSON 轉 Java
- JSON 轉 Markdown
- JSON 轉 SQL
- JSON 轉 TOML
- JSON 轉 TypeScript
- XML 轉 JSON
- JSON 轉 XML
- YAML 轉 JSON
- JSON 轉 YAML
- JSON 轉 Go
- JSON 轉 Rust
- JSON 轉 Swift
- JSON轉C#
- JSON 轉 C++
- JSON 轉 PHP
- JSON 轉 Python