JSONキーソーター

すべてのJSONオブジェクトキーを再帰的にアルファベット順にソートします。配列の順序は保持されます。

並び替え:
インデント:
例:
入力 JSON0 文字
ソート結果

このツールは役に立ちましたか?

コード例

JavaScript

// Recursive JSON key sort
function sortKeys(value, order = 'asc') {
  if (Array.isArray(value))
    return value.map(v => sortKeys(v, order));
  if (value !== null && typeof value === 'object') {
    const keys = Object.keys(value).sort(
      order === 'asc'
        ? (a, b) => a.localeCompare(b)
        : (a, b) => b.localeCompare(a)
    );
    return Object.fromEntries(
      keys.map(k => [k, sortKeys(value[k], order)])
    );
  }
  return value;
}

const sorted = JSON.stringify(
  sortKeys({ z: 3, a: 1, m: 2 }),
  null, 2
);
// { "a": 1, "m": 2, "z": 3 }

Python

import json

data = {"z": 3, "a": 1, "m": 2, "nested": {"y": 9, "b": 2}}

# Built-in sort_keys option
sorted_json = json.dumps(data, sort_keys=True, indent=2)
print(sorted_json)
# {
#   "a": 1,
#   "m": 2,
#   "nested": { "b": 2, "y": 9 },
#   "z": 3
# }

# Reverse / descending sort
def sort_keys_desc(obj):
    if isinstance(obj, dict):
        return {k: sort_keys_desc(obj[k])
                for k in sorted(obj, reverse=True)}
    if isinstance(obj, list):
        return [sort_keys_desc(v) for v in obj]
    return obj

jq (CLI)

# Sort all keys recursively (ascending)
jq 'walk(if type == "object"
  then to_entries | sort_by(.key) | from_entries
  else . end)' input.json

# One-liner for simple objects
echo '{"z":3,"a":1}' | jq -S .
# -S flag sorts keys alphabetically

# Sort and save to file
jq -S . input.json > sorted.json

Go

package main

import (
    "encoding/json"
    "sort"
)

// JSON marshaling in Go preserves map key
// order alphabetically by default.

func SortKeys(v interface{}) interface{} {
    switch val := v.(type) {
    case map[string]interface{}:
        keys := make([]string, 0, len(val))
        for k := range val { keys = append(keys, k) }
        sort.Strings(keys)
        result := make(map[string]interface{})
        for _, k := range keys {
            result[k] = SortKeys(val[k])
        }
        return result
    case []interface{}:
        for i, item := range val {
            val[i] = SortKeys(item)
        }
    }
    return v
}

// json.Marshal on map[string]interface{}
// already sorts keys alphabetically.
b, _ := json.MarshalIndent(data, "", "  ")

よくある質問

なぜJSONキーをソートする必要があるのですか?

キーをソートすると、diffツールでのJSON比較が容易になります。2つのJSONオブジェクトが同じデータでキー順序が異なる場合、diffは誤った差異を表示します。また、正規化されたシリアライズ、設定ファイルの標準化、大きなJSONオブジェクトの視覚的なナビゲーションにも役立ちます。

ネストされたオブジェクトも再帰的にソートされますか?

はい。ソーターはすべての深さのネストされたオブジェクトを再帰的に処理します。配列は元の順序のまま保持され、オブジェクトのキーのみがソートされます。

JSON内の配列はどのように処理されますか?

配列要素は元の順序のまま保持されます。配列は定義上順序付きだからです。配列にオブジェクトが含まれる場合、各オブジェクト内のキーはソートされますが、配列の順序自体は変更されません。

JSON入力にサイズ制限はありますか?

明示的な制限はありませんが、非常に大きなJSONファイル(数MB)はブラウザでの処理が遅くなる場合があります。大きなファイルにはjqなどのコマンドラインツールの使用をお勧めします。

コマンドラインでJSONキーをソートするにはどうすればよいですか?

jqの to_entries | sort_by(.key) | from_entries フィルターや、Pythonの json.dumps(data, sort_keys=True) を使用できます。下記のコード例をご覧ください。

キーをソートするとJSONの意味が変わりますか?

いいえ。JSONオブジェクトはキーと値のペアの順序なしコレクションとして定義されているため、キーの順序には意味的な意味がありません。どのJSONパーサーもキーの順序に関係なく同じ結果を生成します。