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 / 訊息佇列前統一鍵名順序,保證下游消費冪等

使用方法

  1. 把需要排序的 JSON 內容貼到左側輸入框,或點擊「範例」載入一個典型多層級 JSON,或上傳 .json/.txt 檔案
  2. 在底部選項欄中選擇排序模式:預設「按鍵名排序」;如需對陣列內元素排序,切換到「按陣列排序」
  3. 根據需要切換升序 / 降序按鈕,勾選或取消「遞迴」選項(預設開啟)
  4. 點擊「排序」按鈕,右側輸出框會顯示排序後的格式化結果;點擊「複製」或「下載」儲存為 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 排序 + 陣列排序

python
import 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 陣列合併不排序concatJSON Merge 工具
按建立時間排陣列成員陣列元素 .created_atjq 'sort_by(.created_at)'jq sort_by
按價格排商品陣列元素 .pricelodash _.sortByJS 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