Free online developer tool

JSON array diff by ID

Compare two API result lists by a unique field. Find added, removed, and changed records even when their order changes, then download a report with field-level differences.

Compare records

Compare records controls

Loading the tool…

Full JSON report

Runs locally, without uploads or saved inputs. Up to 100,000 characters per input, 10,000 values, and 40 nesting levels. Ctrl+Enter or Command+Enter runs the tool. How your data is handled.

Reconcile API results

Find the actual record changes

The example describes two snapshots of an order list. The second list has a different order, one edited status, one new record, and one removed record. This comparison should produce one added, one removed, one changed, and one unchanged record.

1. Paste two complete arrays

Put the earlier list on the left and the later list on the right. If your response wraps records in an items property, paste the two items arrays. Both inputs need valid JSON, not JavaScript object literals.

2. Choose the identity

Use a field that means the same record in both lists: an order ID, product SKU, or user UUID. The key must be present and unique on each side. An unstable timestamp or a non-unique category cannot identify records reliably.

3. Review the report

Read the four counts first, then inspect the changed paths. Expand the JSON report for before and after values. Keep the original inputs available in your own workflow; the website does not save them between visits.

For comparisons of complete documents in the installed product, read JSON Compare & Diff.

Questions and limits

Before you use the result

How is this different from a text diff?

Root records are matched by a field you choose, such as id or sku. Moving an unchanged record to a new position creates no difference. Object-key order and indentation are also ignored. The report focuses on added, removed, and changed records.

What happens if IDs are missing or duplicated?

The comparison stops with an error naming the affected side or record. Every root record must have a unique, top-level identity value. Only non-empty strings and finite numbers are accepted. The number 1 and the string "1" are different identities.

Does it ignore order in nested arrays?

No. Identity matching applies only to the two root arrays. Nested arrays are compared by position, because their order can carry meaning. Choose a smaller pair of root arrays if you need to reconcile a nested list by its own identity field.

What do the reported paths mean?

Changed fields use JSON Pointer paths relative to the matched record. For example, /status refers to that record’s status property. A slash inside a key becomes ~1, and a tilde becomes ~0. Before and after indexes in the report are zero-based.

Does the tool merge data or choose a winner?

No. It produces a comparison report and leaves both inputs unchanged. A renamed identity is an added record plus a removed record. Review the changes before making updates in your own system.

What are the limits?

Each input can contain up to 1,500 records within the shared character, depth, and value limits. The on-page list shows the first 100 changed, added, or removed records; the downloadable JSON report includes the full result. Numbers that JavaScript cannot represent without changing their value are rejected.

Keep working: all free online tools · JSON to TypeScript · extension and app manual.