Skip to content
jsoncsvonline

100% クライアントサイド JSON 比較

JSON 比較 (Diff)

2つのJSONオブジェクトを比較し、追加・削除・変更されたプロパティをリアルタイムで特定します。

  • サーバー送信ゼロ:完全クライアントサイドでの差分比較
  • ネストされたオブジェクト・配列に対応した構造比較
  • キーの順序無視・柔軟な配列比較オプションを搭載
Array comparison:
元のJSON(左側) (Left / Before)
変更後JSON(右側) (Right / After)

構造比較エンジン

テキストの行差分ではなく、真のJSONデータ差分を検出。

行単位のdiffツールは、キーの順序が入れ替わったり1行に圧縮されたJSONを正しく比較できません。構文木(AST)を比較して意味のあるデータ変更のみを抽出します。

キー順序を無視した比較

RFC 8259に準拠し、オブジェクトのキー順序が入れ替わっただけの無害な差分を無視して重要な値の変化のみをハイライト。

深い階層まで再帰的な構造比較

何層にもネストされたオブジェクトや配列をたどり、追加・削除・変更されたすべてのプロパティに正確なパスを付与。

配列の柔軟な比較モード

インデックス順での厳密比較と、順序不問のマルチセット比較を切り替え可能。順不同のAPIレスポンスも正確に比較できます。

2つのJSONファイルをオンラインで比較する方法

一般的な行単位のテキスト差分ツール(git diff やテキスト比較)でJSONを比較すると、キーの順序やインデントの違いだけで差分と誤判定されてしまうことが多々あります。

当ツールの構造的JSON差分エンジンは、以下の3ステップで本質的なデータの違いを正確に特定します:

  1. 構文の正規化: 両方のドキュメントをRFC 8259準拠のパーサーでメモリ上のデータツリーに変換します。
  2. プロパティパスの再帰的走査: すべてのキーとネストされた配列要素に完全なJSONパス(例: users[0].address.city)を割り当てます。
  3. カテゴリ別の差分出力: プロパティの追加・削除・値や型の変更を抽出し、色分けタグで分かりやすくハイライトします。

オブジェクトのキー順序の扱い(RFC 8259準拠)

公式のJSON仕様(RFC 8259)において、オブジェクトは名前と値の順序のない集合と定義されています。そのため、{"a": 1, "b": 2} と {"b": 2, "a": 1} は意味的に全く同じデータです。

本ツールはデフォルトで「キー順序を無視」が有効になっており、見た目の順序変更によるノイズを除去します。API要件等で厳密な順序比較が必要な場合はチェックを外してください。

配列の比較:順序の一致 vs 順序無視

オブジェクトのキーとは異なり、JSON配列の要素は順序付けられています。しかしRESTやGraphQL APIでは、タグや権限リストのように順序が任意である配列も多く存在します。

本ツールは「配列の順序を無視」トグルを備えています。有効にすると位置に関係なく値の等価性で要素を照合し、先頭への要素追加による連鎖的な差分誤検知を防ぎます。

差分レポートのエクスポートと共有

比較結果はRFC 6902準拠のJSON Patch形式、またはPull Requestやコードレビューで使いやすいMarkdownチェンジログとしてダウンロードできます。ブラウザ内でのみ実行されるため、機密データも安全です。

Python および Node.js によるJSON差分のプログラム実装

テストスイートやCI/CDパイプラインでJSON比較を自動化する場合の標準的なコード例です:

Python (DeepDiff)

import json
from deepdiff import DeepDiff

# Load JSON files or API responses
with open('original.json') as f1, open('modified.json') as f2:
    original_data = json.load(f1)
    modified_data = json.load(f2)

# Deep structural diff with key-order independence
differences = DeepDiff(original_data, modified_data, ignore_order=False)

print("Added keys:", differences.get('dictionary_item_added', {}))
print("Removed keys:", differences.get('dictionary_item_removed', {}))
print("Values changed:", differences.get('values_changed', {}))
print("Type changes:", differences.get('type_changes', {}))

Node.js / TypeScript (fast-json-patch)

import fs from 'node:fs';
import { compare } from 'fast-json-patch';

// Read and parse documents locally
const original = JSON.parse(fs.readFileSync('original.json', 'utf8'));
const modified = JSON.parse(fs.readFileSync('modified.json', 'utf8'));

// Generate standard RFC 6902 JSON patch differences
const delta = compare(original, modified);
console.log('Structured differences:', delta);
// Output: [ { op: 'replace', path: '/user/age', value: 26 }, ... ]

ターミナルで jq と diff を使ってJSONを比較する

UnixやmacOSのターミナルでは、diffを実行する前に jq -S でキー順序をソートします:

# Sort keys alphabetically with jq, then run unified diff
diff -u <(jq -S . original.json) <(jq -S . modified.json)

比較前にJSONを整理したい場合は、当サイトの JSON 整形ツール、構文エラーを検出する JSON バリデータ、表形式に変換する JSON to CSV 変換ツール.

FAQ

よくある質問

JSON Diffとは何ですか? テキスト比較との違いは?

テキスト比較(行単位)と異なり、JSONの構文木(AST)を比較します。キーの順序の違いやインデントの違いによる偽の差分を排除し、実際のデータ変更のみを検出します。

オブジェクトのキーの順序は無視されますか?

はい、デフォルトでキー順序は無視されます。RFC 8259仕様上、{"a":1,"b":2} と {"b":2,"a":1} は同一データとみなされます。

配列の順序を無視して比較することはできますか?

はい。「配列の順序を無視」オプションを有効にすると、順不同のAPIレスポンスでも要素の一致を正しく判定できます。

データがサーバーにアップロードされることはありますか?

いいえ、一切ありません。変換処理はすべてこのブラウザ内のWeb Workerでローカルに実行されるため、ファイルが外部へ送信されることはありません。ブラウザの開発者ツールの「ネットワーク」タブを開いて変換を実行すれば、リクエストが一切発生しないことをご確認いただけます。そのため、容量制限や1日の利用上限もありません。

ファイルサイズの上限はありますか?

制限はありません。データは分割(チャンク)して読み込まれ、ストリーミング形式で書き出されるため、ファイルサイズが大きくなってもメモリ消費は一定に保たれます。実質的な上限はお手元のマシンの性能次第で、メガバイト単位ではなくギガバイト単位の大容量データも扱えます。

料金はかかりますか? アカウント登録は必要ですか?

完全に無料で、アカウント登録も試用期間も有料プランもありません。どなたでもすべての機能を無制限でご利用いただけます。

関連する変換ツール・開発者ツール