Инструмент за сравнение на JSON - Сравнете JSON онлайн безплатно | JSON Разлика
Сравнете JSON онлайн безплатно с нашия бърз инструмент за сравнение на JSON. Намерете разлики мигновено с цветово кодирани резултати. 100% сигурен, базиран в браузъра JSON diff. Без нужда от регистрация.
Инструмент за сравнение на JSON
Документация
Инструментът за сравнение на JSON, често наричан инструмент за сравнение на разлики в JSON, сравнява две стойности в JSON (JavaScript Object Notation) и показва какво се е променило между тях. Той изброява всеки добавен, премахнат или променен член на обект или елемент на масив, заедно с точното му местоположение в данните. Тази страница обяснява как работи инструментът на whiz.tools за сравнение на JSON, с примери с изчисление, основани на действителната му логика за сравнение.
Какво представлява сравнението на JSON?
Сравнението на JSON е процесът на проверка на два JSON документа един спрямо друг с цел откриване на разликите. JSON документът е текст, изграден от обекти (двойки ключ-стойност във фигурни скоби), масиви (подредени списъци в квадратни скоби) и примитивни стойности, като низове, числа, булеви стойности и null. Сравняването на два такива документа на око е бавно и податливо на грешки, след като надхвърлят няколко реда, затова инструментът за сравнение извършва съпоставянето автоматично и откроява всяка промяна.
Разработчиците използват този вид сравнение за проверка на отговори от API, проследяване на промени в конфигурационни файлове, потвърждаване, че при миграция на данни не е загубена информация, и преглед на промени в JSON файлове в система за контрол на версиите.
Как инструментът сравнява две JSON стойности
Инструментът анализира двата входа със стандартен JSON анализатор, след което обхожда едновременно двете получени стойности, по едно ниво. На всяка стъпка той задава последователно три въпроса:
- Имат ли двете стойности различни типове (например едната е обект, а другата е число), или едната е
null, а другата не е? Ако да, той записва промяна на това място и спира по-нататъшното сравнение. - И двете стойности ли са примитивни (низ, число, булева стойност или null)? Ако да, той ги сравнява директно. Всяка разлика, включително промяна от числото
123към низа"123", се счита за промяна. - И двете стойности ли са обекти или и двете са масиви? Ако да, той сравнява съдържанието им според правилата по-долу и рекурсивно обработва вложените обекти или масиви.
Всяка разлика се записва с път, например user.address.city или tags[1], така че да бъде лесно откриваема в оригиналния документ. Членовете на обектите се свързват с точка, а елементите на масивите се показват с индекса си в квадратни скоби. Разлика в самия връх на документа, например масив, заменен с обект, няма път вътре в данните, затова се обозначава с $. Това е кореновият идентификатор, определен от RFC 9535, стандарта JSONPath, и обозначава целия документ.
Сравняване на обекти
За два JSON обекта инструментът събира всеки ключ, който се среща в някой от обектите. За всеки ключ:
- Ако ключът съществува само във втория обект, това е добавен член.
- Ако ключът съществува само в първия обект, това е премахнат член.
- Ако ключът съществува и в двата обекта, инструментът сравнява двете стойности рекурсивно.
Редът на ключовете няма значение. Стандартът JSON не определя ред за членовете на обект, затова {"a":1,"b":2} и {"b":2,"a":1} се третират като идентични.
Сравняване на масиви
Масивите се сравняват по позиция, а не по съдържание. Инструментът преминава през двата масива индекс по индекс и сравнява елемента на всеки индекс до дължината на по-дългия масив. Ако единият масив е по-къс, допълнителните елементи в края на по-дългия масив се показват като добавени или премахнати.
Това означава, че инструментът никога не се опитва да съпоставя елементи на масив по съдържанието им. Той не забелязва, че даден обект е бил „преместен“ от индекс 1 на индекс 2; вижда само, че стойността на всеки индекс се е променила. Изтриването или вмъкването на елемент в средата на масив измества всеки следващ елемент с една позиция, затова обикновено се показва като няколко отделни промени, а не като едно ясно добавяне или премахване.
Пример с решение
Пример 1: сравнение на два обекта
Първи JSON:
1{ "user": { "address": { "city": "New York", "zip": "10001" } } }
2Втори JSON:
1{ "user": { "address": { "city": "Boston", "zip": "02108" } } }
2Резултат:
- Променено
user.address.city:"New York"→"Boston" - Променено
user.address.zip:"10001"→"02108"
Пример 2: промяна в края на масив
Първи JSON:
1{ "tags": ["important", "urgent", "review"] }
2Втори JSON:
1{ "tags": ["important", "critical", "review", "documentation"] }
2Индекс 0 не е променен, индекс 1 е променен, индекс 2 не е променен, а индекс 3 съществува само във втория масив. Резултат:
- Променено
tags[1]:"urgent"→"critical" - Добавено
tags[3]:"documentation"
Пример 3: премахване на елемент от средата на масив
Този пример показва какво се случва, когато елемент бъде премахнат от средата на масив, тъй като това често води до объркване.
Първи JSON:
1{
2 "products": [
3 { "id": 1, "name": "Laptop", "price": 999.99 },
4 { "id": 2, "name": "Mouse", "price": 24.99 },
5 { "id": 3, "name": "Keyboard", "price": 59.99 }
6 ]
7}
8Втори JSON с изтрит запис „Mouse“ и добавен в края запис „Monitor“:
1{
2 "products": [
3 { "id": 1, "name": "Laptop", "price": 899.99 },
4 { "id": 3, "name": "Keyboard", "price": 59.99 },
5 { "id": 4, "name": "Monitor", "price": 349.99 }
6 ]
7}
8Човек, който гледа това, би казал: „Mouse е премахнат, а Monitor е добавен.“ Тъй като инструментът сравнява строго по индекс, той не го възприема така. Той сравнява индекс 0 с индекс 0, индекс 1 с индекс 1 и индекс 2 с индекс 2, така че всяко поле след изтрития елемент се съпоставя с неправилния обект. Действителният резултат е седем промени:
- Променено
products[0].price:999.99→899.99 - Променено
products[1].id:2→3 - Променено
products[1].name:"Mouse"→"Keyboard" - Променено
products[1].price:24.99→59.99 - Променено
products[2].id:3→4 - Променено
products[2].name:"Keyboard"→"Monitor" - Променено
products[2].price:59.99→349.99
За по-ясен резултат при сравняване на такива списъци сортирайте или подредете двата масива по един и същи начин, преди да ги поставите, например като запишете всеки списък в един и същи ред или съпоставите обектите по поле с идентификатор преди сравнението.
Какво не прави инструментът
- Той не съпоставя елементите на масив по съдържание. Както е показано по-горе, той сравнява единствено по позиция на индекса, затова не може да разпознае, че даден елемент е преместен, а не променен.
- Той не открива циклични препратки. На практика това не е ограничение: и двата входа идват от
JSON.parse, който винаги създава обикновено дърво и никога не може да произведе стойност, препращаща обратно към себе си. Циклични препратки не могат да съществуват в действителен JSON текст. - Той не предлага настройка за сортиране на масивите преди сравнение. Единственият начин да избегнете ефекта от изместването на индексите, описан по-горе, е да пренаредите елементите във входа, преди да ги поставите.
Как се използва инструментът
- Поставете първия JSON документ в лявото поле, а втория — в дясното.
- Инструментът ги сравнява автоматично, когато и двете полета съдържат текст; или щракнете върху Compare, за да стартирате сравнението ръчно.
- Прегледайте списъка с резултатите. Всеки ред показва път, например
user.age, и дали стойността е добавена, премахната или променена, като старата и новата стойност са показани една до друга. - Щракнете върху Copy, за да копирате резултатите като обикновен текст.
Ако дадено поле съдържа текст, който не е действителен JSON, инструментът показва грешка под полето вместо резултат от сравнение. Когато и двете полета са невалидни, и двете грешки се показват едновременно.
Често задавани въпроси
Какво се счита за разлика между две JSON стойности?
Свойство или елемент на масив е различен, ако съществува само в единия от двата документа или ако съществува и в двата, но съдържа различна стойност или е от различен тип. Промяната на стойност от числото 5 към низа "5" се счита за промяна, дори да изглеждат сходни.
Има ли значение редът на елементите? Зависи от контейнера. JSON обектите нямат определен ред на членовете, затова два обекта с едни и същи ключове и стойности, но в различен ред, се третират като идентични. Масивите са подредени и инструментът ги сравнява по позиция на индекса, затова преместването на елемент на друга позиция се отчита като поредица от промени, а не като преместване.
Какво означава пътят в резултата $?
Това означава, че се е променил целият документ, а не само част от него. Това се случва, когато двата входа са различни видове стойност на най-горно ниво, например масив от едната страна и обект от другата, или обикновените числа 1 и 2. $ е кореновият идентификатор от RFC 9535, стандарта JSONPath.
Изпращат ли се моите JSON данни към сървър? Не. Сравнението се извършва в браузъра с JavaScript. Нищо не се качва.
Влияе ли форматирането, например отстъпите или минимизирането, върху резултата? Не. И двата входа се анализират като JSON стойности преди сравнението, така че интервалите, отстъпите и новите редове нямат значение. Сравняват се само действителните данни.
Може ли инструментът да сравнява JSON с коментари или крайни запетаи? Не. Стандартният JSON, както е определен в RFC 8259, не допуска коментари или крайни запетаи. Входът, който ги съдържа, се отхвърля като невалиден.
Източници
- IETF. „Формат за обмен на данни JavaScript Object Notation (JSON).“ RFC 8259, декември 2017.
- IETF. „JavaScript Object Notation (JSON) Patch.“ RFC 6902, април 2013.
- IETF. „JSONPath: изрази за заявки към JSON.“ RFC 9535, февруари 2024. (Раздел 2,2 определя кореновия идентификатор
$.) - Mozilla Developer Network. „JSON.parse().“