яка різниця між json та xml [закрито]


75

У чому різниця між JSON та XML?



1
можливий дублікат stackoverflow.com/questions/453158/…
ACP

2
@Pandiya: це питання набагато більш спеціалізоване, ніж це. Я не вважаю це дублем.
Чарльз Стюарт,

@pia, не могли б Ви трохи детальніше розказати своє питання? Думаю, це гарне запитання, але форматування не є оптимальним, і воно дуже коротке - поки що недостатньо для +1.
мафу

Головна відмінність полягає в тому, що люди можуть нескінченно сперечатися про "правильний" спосіб використання XML. Але JSON не має таких прикидів. Після цього це як кокс проти пепсі, ніби є різниця. Sez мені!
Девід Ван Брінк

Відповіді:


163

Принципова відмінність, про яку, схоже, не згадувала жодна інша відповідь, полягає в тому, що XML - це мова розмітки (як це насправді сказано в її назві), тоді як JSON - це спосіб представлення об'єктів (як це також зазначено в його назві).

Мова розмітки - це спосіб додавання додаткової інформації до вільного текстового тексту, наприклад

Here is some text.

За допомогою XML (використовуючи певний словниковий запас) ви можете помістити:

<Document>
    <Paragraph Align="Center">
        Here <Bold>is</Bold> some text.
    </Paragraph>
</Document>

Саме це робить мови розмітки настільки корисними для представлення документів.

Позначення об'єкта, як JSON, не таке гнучке. Але це, як правило, добре. Коли ви представляєте об'єкти, вам просто не потрібна додаткова гнучкість. Щоб представити наведений вище приклад у JSON, вам фактично довелося б вирішити деякі проблеми, які XML вирішує за вас.

{
    "Paragraphs": [
        {
            "align": "center",
            "content": [
                "Here ", {
                    "style" : "bold",
                    "content": [ "is" ]
                },
                " some text."
            ]
        }
    ]
}

Це не так приємно, як XML, і причина в тому, що ми намагаємось зробити розмітку з позначенням об’єкта. Тому ми повинні винайти спосіб розкидати фрагменти простого тексту навколо наших об’єктів, використовуючи масиви «вмісту», які можуть містити суміш рядків та вкладених об’єктів.

З іншого боку, якщо у вас є типова ієрархія об’єктів і ви хочете представляти їх у потоці, JSON більше підходить для цього завдання, ніж HTML.

{
    "firstName": "Homer",
    "lastName": "Simpson",
    "relatives": [ "Grandpa", "Marge", "The Boy", "Lisa", "I think that's all of them" ]
} 

Ось логічно еквівалентний XML:

<Person>
    <FirstName>Homer</FirstName>
    <LastName>Simpsons</LastName>
    <Relatives>
        <Relative>Grandpa</Relative>
        <Relative>Marge</Relative>
        <Relative>The Boy</Relative>
        <Relative>Lisa</Relative>
        <Relative>I think that's all of them</Relative>
    </Relatives>
</Person>

JSON більше схожий на структури даних, які ми оголошуємо мовами програмування. Також він має менш зайве повторення імен.

Але найголовніше, що у нього є визначений спосіб розрізнення "запису" (елементи впорядковані, ідентифіковані за іменами) та "списку" (елементи, упорядковані, ідентифіковані за позицією). Позначення об'єкта практично марне без такої різниці. І XML не має такої різниці! У моєму прикладі XML <Person>є запис і <Relatives>є списком, але вони не ідентифікуються як такі синтаксисом.

Натомість XML має "елементи" проти "атрибути". Це схоже на таку саму різницю, але це не так, оскільки атрибути можуть мати лише рядкові значення. Вони не можуть бути вкладеними об’єктами. Отже, я не міг застосувати цю ідею <Person>, оскільки мені не потрібно перетворюватись <Relatives>на єдиний рядок.

Використовуючи зовнішню схему або додаткові визначені користувачем атрибути, ви можете формалізувати різницю між списками та записами в XML. Перевага JSON полягає в тому, що синтаксис низького рівня має таку відмінність, тому він дуже лаконічний і універсальний. Це означає, що JSON за замовчуванням більш "самоописується", що є важливою метою обох форматів.

Тож JSON повинен бути першим вибором для позначення об’єктів, де найкращим місцем XML є розмітка документа.

На жаль для XML, ми вже маємо HTML як першу у світі мову розмітки текстових розміток. Була зроблена спроба переформулювати HTML з точки зору XML, але в цьому немає великої переваги.

Отже, XML (на мій погляд) мав би бути досить обмеженою нішевою технологією, яка найкраще підходить лише для винаходу власних мов розмітки текстового тексту, якщо ви з якихось причин не хочете використовувати HTML. Проблема полягала в тому, що в 1998 р. Все ще було багато галасу про Інтернет, і XML став популярним завдяки його поверхневій схожості з HTML. Дивним вибором дизайну було спробувати застосувати до ієрархічних даних синтаксис, насправді розроблений для зручної розмітки.


8
Два голоси проти, коментарів немає! Це життя.
Даніель Ервікер,

1
@Daniel: Які голоси проти? Я не бачу жодного. Якщо ви ловите голоси співчуття, у вас повинна бути принаймні причина ...
Гуффа

2
@Tomer Gable - Ви, мабуть, пропустили частину, що звучить "За допомогою зовнішньої схеми ..." А XSLT має навіть менший сенс як додаток для XML, ніж моделювання даних. Насправді вони обманювали, вигадуючи значні нові синтаксиси, застосовні всередині рядків атрибутів, тому насправді це не XML. Сказати, що JSON потребує додаткових компонентів, є дивним моментом: все, що ви зараховуєте до XML, також є додатковими компонентами.
Даніель Ервікер

4
Очевидно, це була ДУЖЕ конструктивна відповідь (і питання), і її не слід було закривати. Знову проголосуйте за -1 для модів.
rcd

4
Повторне повторення та пояснення того, що XML насправді є мовою розмітки замість формату даних, було надзвичайно корисним. Дякуємо, що написали це!
jrahhali

27

Вони обидва є форматами даних для ієрархічних даних, тому, хоча синтаксис досить різний, структура схожа. Приклад:

JSON:

{
  "persons": [
    {
      "name": "Ford Prefect",
      "gender": "male"
    },
    {
      "name": "Arthur Dent",
      "gender": "male"
    },
    {
      "name": "Tricia McMillan",
      "gender": "female"
    }
  ]
}

XML:

<persons>
  <person>
    <name>Ford Prefect</name>
    <gender>male</gender>
  </person>
  <person>
    <name>Arthur Dent</name>
    <gender>male</gender>
  </person>
  <person>
    <name>Tricia McMillan</name>
    <gender>female</gender>
  </person>
</persons>

Однак формат XML є більш досконалим, ніж показано в прикладі. Наприклад, ви можете додати атрибути до кожного елемента, а також можете використовувати простори імен для елементів розділів. Існують також стандарти для визначення формату XML-файлу, мови XPATH для запиту даних XML та XSLT для перетворення XML у дані презентації.

Формат XML існує вже деякий час, тому для нього розроблено багато програмного забезпечення. Формат JSON є досить новим, тому підтримка набагато менша.

Хоча XML розроблявся як незалежний формат даних, JSON був розроблений спеціально для використання з Javascript та AJAX, тому формат точно такий же, як і літеральний об'єкт Javascript (тобто це підмножина коду Javascript, як, наприклад, може не містить виразів для визначення значень).


2
"формат точно такий самий, як і буквальний об'єкт Javascript." - не зовсім так, тексти JSON є підмножиною літералів об'єктів JS.
Даніель Ервікер,

@Daniel: Звичайно, це підмножина, ви, природно, не можете писати в Javascript нічого, що можете, як, наприклад, викликати функцію, щоб отримати значення для члена. Тому ви проголосували за відповідь?
Guffa,

1
Арг ... Я насправді мав намір проголосувати за вас, тепер SO не дозволить мені це виправити, якщо ви не внесете зміни. Поставте прапорець "точно так само, як від" до "підмножини формату", і я виправляю це якомога швидше.
Даніель Ервікер,

22

Різниця між XML та JSON полягає в тому, що XML - це мета-мова / мова розмітки, а JSON - це легкий обмін даними. Тобто синтаксис XML розроблений спеціально, щоб не мати властивої йому семантики. Назви окремих елементів нічого не означають, поки певна програма обробки не обробить їх певним чином. На відміну від цього, синтаксис JSON має певну семантику, вбудовану в речі між {} - це об’єкт, речі між [] - це масив тощо.

Таким чином, парсер JSON точно знає, що означає кожен документ JSON. Аналізатор XML знає лише, як відокремити розмітку від даних. Щоб розібратися зі значенням XML-документа, вам слід написати додатковий код.

Для ілюстрації суті, дозвольте мені запозичити приклад Гуффи:

{   "persons": [
  {
    "name": "Ford Prefect",
    "gender": "male"
 },
 {
   "name": "Arthur Dent",
   "gender": "male"
  },
  {
    "name": "Tricia McMillan",
    "gender": "female"
  }   ] }

Еквівалент XML, який він дає, насправді не одне і те ж, оскільки, хоча приклад JSON є семантично повним, XML потребує інтерпретації певним чином, щоб мати той самий ефект. По суті, приклад JSON використовує встановлену мову розмітки, семантика якої вже відома, тоді як приклад XML створює абсолютно нову мову розмітки без жодної заздалегідь визначеної семантики.

Кращим XML-еквівалентом було б визначити (фіктивну) мову XJSON з такою ж семантикою, що і JSON, але використовуючи синтаксис XML. Це може виглядати приблизно так:

<xjson>   
  <object>
    <name>persons</name>
    <value>
      <array>
         <object>
            <value>Ford Prefect</value>
            <gender>male</gender>
         </object>
         <object>
            <value>Arthur Dent</value>
            <gender>male</gender>
         </object>
         <object>
            <value>Tricia McMillan</value>
            <gender>female</gender>
         </object>
      </array>
    </value>   
  </object> 
 </xjson>

Після того, як ви написали процесор XJSON, він може робити саме те, що робить процесор JSON, для всіх типів даних, які може представляти JSON, і ви можете перекладати дані без втрат між JSON і XJSON.

Отже, скаржитися на те, що XML не має тієї самої семантики, що й JSON, це пропускати суть. Синтаксис XML за задумом не містить семантики. Суть полягає в тому, щоб надати базовий синтаксис, який можна використовувати для створення мов розмітки з будь-якою потрібною вами семантикою. Це робить XML чудовим для створення спеціальних форматів даних та документів, оскільки вам не потрібно будувати парсери для них, вам просто потрібно написати процесор для них.

Але недоліком XML є те, що синтаксис є багатослівним. Для будь-якої мови розмітки, яку ви хочете створити, ви можете створити набагато стисліший синтаксис, який виражає конкретну семантику вашої конкретної мови. Таким чином, синтаксис JSON набагато компактніший, ніж мій гіпотетичний XJSON вище.

Якщо з цього випливає, що для дійсно широко використовуваних форматів даних, додатковий час, необхідний для створення унікального синтаксису та написання синтаксичного аналізатора для цього синтаксису, компенсується більшою стислістю та інтуїтивнішим синтаксисом користувацької мови розмітки. З цього також випливає, що часто має сенс використовувати JSON з його усталеною семантикою, ніж створювати безліч мов розмітки XML, для яких потім потрібно впровадити семантику.

З цього також випливає, що має сенс створювати прототипи певних типів мов та протоколів у XML, але, коли мова чи протокол увійшли до загального користування, слід подумати про створення більш компактного та виразного користувацького синтаксису.

Як побічне зауваження цікаво, що SGML це визнав і забезпечив механізм визначення зменшеної розмітки для документа SGML. Таким чином, ви можете фактично написати SGML DTD для синтаксису JSON, який дозволить читати документ JSON парсером SGML. XML видалив цю можливість, а це означає, що сьогодні, якщо ви хочете отримати більш компактний синтаксис для певної мови розмітки, вам доведеться залишити XML позаду, як це робить JSON.


Чи може XML обробляти двозначність послідовностей пар ім’я / значення під вашим об’єктним вузлом у XJSON? Я б подумав, що потрібно буде якось вказати, яке ім'я поєднується з яким значенням, або шляхом додавання іншого рівня ("атрибут" або "властивість", або якогось іншого), або, додаючи спільний атрибут між кожним іменем та значенням?

Інші відповіді називають XML мовою розмітки, а JSON - форматом презентації. Тепер ви кажете, що JSON є мовою розмітки, а XML насправді є "мета" мовою, що б це не означало. Ви можете пояснити? Що я відповідаю, якщо хтось запитує мене про це на співбесіді?
Harsha_K

4

Це два різні способи представлення даних, але вони досить несхожі. На сторінках вікіпедії для JSON та XML подано кілька прикладів кожного з них, і є параграф порівняння


3

Це два формати подання інформації. Хоча JSON був розроблений для того, щоб бути більш компактним, XML був спроектований, щоб бути більш читабельним.


3
Так, очевидно, два різних уявлення. Але я не думаю, що XML вважається більш читабельним із двох. JSON зазвичай трохи компактніший, але я не думаю, що це було важливим критерієм проектування; швидше, читабельність, простота та простота використання (зокрема, з javascript). Що ще важливіше, два насправді мають досить різну логічну структуру: XML - це вбудований формат розмітки з ієрархічною моделлю; а JSON - це нотація об’єкта з моделлю об’єкт / кадр / графік (хоча „графік“ може бути завищеним, оскільки він не має поняття ідентичності об’єкта).
StaxMan

Можливо, це пізня репліка, але мені цікаво, чому вищезазначена відповідь проголосована проти. (Я повинен сказати думку замість відповіді). Те, що сказав @StaxMan, - це також особиста думка (навіть це можна довести словами на кшталт " я не думаю, що це було важливим критерієм проектування) ..
Stunner

В оригінальній відповіді нічого не зазначалося, щоб підтвердити будь-яке твердження про "JSON, розроблений для того, щоб бути більш компактним, XML більш читабельним", було б підставою, якби я хотів це DV (я не мав); і не вдалося згадати про більш принципову різницю.
StaxMan

2

XML використовує структури тегів для представлення елементів, наприклад <tag>item</tag>, тому документ XML - це набір тегів, вкладених один в одного. А синтаксис JSON виглядає як конструкція з мови Javascript, з усіма речами, такими як списки та словники:

{
 'attrib' : 'value',
 'array' : [1, 2, 3]
}

Отже, якщо ви використовуєте JSON, дуже просто використовувати рядки JSON у багатьох мовах сценаріїв, особливо Javascript та Python.


1
Так, на високому рівні, але ваш приклад неприпустимий JSON: імена полів повинні бути в лапках із подвійними лапками. Те саме для рядкових значень.
StaxMan

1
На жаль, зараз виправлено :)
Enchantner
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.