"Если YAML удобен для чтения человеком, то почему трон обмена данными занимает JSON?"
"Где сильна YAML и почему JSON не мог проиграть?"


🔥 1. Начало войны форматов данных

Давным-давно программистам понадобился способ хранения и обмена данными.
В начале XML занимал трон.

<person>
    <name>Alice</name>
    <age>25</age>
    <skills>
        <skill>Python</skill>
        <skill>Django</skill>
    </skills>
</person>

Но XML был слишком многословным и тяжелым, его было трудно читать.
Поэтому появились JSON и YAML.


🤖 2. JSON: завоевание трона обмена данными

В 2001 году Дуглас Крокфорд (Douglas Crockford) представил JSON, вдохновленный объектным представлением JavaScript.
"Простой, легкий и понятный для машин формат обмена данными!"

Цель JSON была ясна:
Структура, которую может читать человек, но которая более удобна для компьютеров
Оптимизирован для передачи данных между браузером и сервером
Легко интегрируется с объектно-ориентированными языками (JavaScript, Python и др.)

Пример JSON:

{
    "name": "Alice",
    "age": 25,
    "skills": ["Python", "Django"]
}
  • Структуру данных можно было выразить только с помощью {} и [],
  • Поскольку JavaScript в вебе мог сразу обрабатывать JSON, он быстро стал популярным.
  • В частности, стандарт формата данных на REST API позволил JSON занять трон.

🧐 3. YAML: формат данных, удобный для человека

Но были и те, кто хотел формат, более удобный для чтения человеком.
"Разве не лучше использовать без ненужных фигурных скобок и кавычек для представления структуры данных?"

Поэтому в 2001 году появился YAML (Ain’t Markup Language).

name: Alice
age: 25
skills:
  - Python
  - Django

Характеристики YAML:
Легко читается человеком (все аккуратно, без фигурных скобок и кавычек!)
Поддерживает комментарии (можно использовать #)
Удобен для использования в конфигурационных файлах

Поэтому YAML стал королем конфигурационных файлов.
Он используется как основной формат в таких местах, как Kubernetes, Docker, Ansible, CI/CD, GitHub Actions!

Но на рынке обмена данными YAML не смог победить JSON.
Почему? 🤔


🤯 4. Почему YAML не смог победить JSON?

Если бы YAML был удобен для чтения человеком, он мог бы стать более популярным…
Но реальность такова, что это не случилось.

✅ Причины победы JSON:
1. Синтаксис слишком свободен?
- JSON четко структурирован с помощью {} и [],
- в то время как YAML использует отступы для структуры, что увеличивает вероятность ошибок.
- Ошибка одного пробела может привести к сбою! (особенно проблема Tab vs Space в YAML 🤯)

  1. Медленный парсинг
  2. JSON можно быстро парсить, в то время как
  3. YAML, обладая гибким синтаксисом требует больше обработки, из-за чего скорость ниже.
  4. При обработке большого объема данных это менее эффективно, чем JSON.

  5. YAML имеет проблемы с безопасностью

  6. YAML может включать исполняемый код (!python/object),
  7. существуют риски безопасности (RCE, удаленное выполнение кода).
  8. JSON безопасен, так как это чистые данные!

  9. Не поддерживается по умолчанию в браузерах

  10. JSON является основной структурой объектов JavaScript, но
  11. для YAML необходимо использовать отдельные библиотеки.

В итоге, JSON был выбран как стандарт для веба и обмена данными.


🚀 5. Но YAML занял трон конфигурационных файлов!

Однако это не означает, что YAML исчез.
Если JSON стал стандартом обмена данными, то YAML стал стандартом конфигурационных файлов.

🔥 Причины силы YAML:

  • Поддержка комментариев (#) → удобно при написании конфигурационных файлов
  • Легко читается человеком и удобно редактируется
  • Используется в качестве основного формата в DevOps, таких как Kubernetes, Docker, Ansible

Примеры реального использования:

  • docker-compose.yml
  • kubernetes.yml
  • github-actions.yml
  • ansible-playbook.yml

Однако, чтобы использовать YAML для обмена данными, нужно обратить внимание на некоторые детали.
В частности, в Django Rest Framework (DRF) можно установить способ сериализации как YAMLRenderer, но по умолчанию это все равно JSONRenderer.

from rest_framework.renderers import JSONRenderer, YAMLRenderer
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    renderer_classes = [JSONRenderer, YAMLRenderer]

    def get(self, request):
        data = {"message": "Hello, YAML!"}
        return Response(data)

Однако большинство API используют JSON по умолчанию!
Потому что YAML не широко используется из-за проблем с производительностью и безопасностью.

JSON vs YAML Medieval Battle


🎯 6. Заключение: JSON против YAML, кто лучше?

✅ Когда выбирать JSON:
- Веб API, обмен данными (в руках скорость и надежность!)
- Хранение NoSQL данных
- Когда нужно использовать непосредственно в браузере

✅ Когда выбирать YAML:
- Конфигурационные файлы (Kubernetes, Docker, CI/CD)
- Создание документов, удобных для чтения человеком
- Задачи, связанные с DevOps

Однострочное резюме:
🚀 "JSON - король обмена данными, YAML - король конфигурационных файлов!"