AXON — это нотация для сериализованного представления объектов, документов и данных в текстовой форме. Она объединяет в себе простоту JSON, расширяемость XML и удобочитаемость YAML.
Есть проект pyaxon на python, с которым можно "поиграться". Впрочем, он создавался таким образом, чтобы не сильно уступать по скорости с модулем json. Поэтому он может сгодиться и для реальных дел.
Зачем AXON?
AXON появился как попытка справиться с недостатками или неудобствами JSON и XML, но сохранить при этом их достоинства и возможности, дополнительно добавив удобочитаемость, присущую YAML.
AXON содержит "улучшенный" вариант JSON
1. JSON имеет два неудобства:
- имена атрибутов/ключей, которые являются идентификаторами приходится заключать в кавычки;
- легко забыть запятую в случае вставки новой пары ключ: значение.
AXON устраняет эти неудобства следующим образом:
- можно не заключать в кавычки имена, которые являются идентификаторами;
- совершенно опускаются разделительные запятые, используются только пробельные символы для разделения элементов.
В результате получается более компактное представление и удобство восприятия при форматировании.
Для сравнения:
JSON
{ "name": "Alex", "birth": "1979-12-25", "email": "mail@example.com"} [ "Alex" "1979-12-25" "mail@example.com"]
AXON
{ name: "Alex" birth: ^1979-12-25 email: "mail@example.com"} [ "Alex" ^1979-12-25 "mail@example.com"]
2. В JSON не гарантируется, что после загрузки
{ "name": "Alex", "birth": "1979-12-25", "email": "mail@example.com"}
порядок ключей/атрибутов сохранится.
В AXON констатируется, что
{ name: "Alex" birth: ^1979-12-25 email: "mail@example.com"}
преобразуется в mapping без сохранения порядка ключей.
В то же время констатируется, что
[ name: "Alex" birth: ^1979-12-25 email: "mail@example.com"]
преобразуется в mapping с сохранением порядка ключей.
3. AXON поддерживает синтаксиc для представления даты и времени в ISO-подобном формате:
- даты
^2010-12-31
- времени
^12:30 ^12:30:15 ^12:30+03:00 ^12:30:15-04:30
- даты и времени
^2010-12-31T12:30 ^2010-12-31T12:30:05.0125 ^2010-12-31T12:30+04:00 ^2010-12-31T12:30:05.0123-04:00
а также для представления десятичных чисел:
1D 123456789D 3.14D 1.23e-6D
4. AXON также позволяет определять метки неатомарных значений и использовать их в качестве внутренних ссылок. Это позволяет при необходимости не создавать копии многократно используемых неатомарных значений при сериализации/десериализации.
Например:
[ { prev: &a (2012-12-30 10:00) next: &c (2012-01-01 12:00) } { prev: &b (2012-12-31 13:00) next: *a } { prev: *c next: *b } ]
Метка имеет префикс & (&a &b &c), а ссылка имеет префикс * (*a *b *c).
Модель данных AXON содержит вариант модели Infoset XML в более компактной нотации
Рассмотрим иллюстративный пример XML представления структурированных данных:
<person> <name>John Smith</name> <age>25</age> <address type="home"> <street>21 2nd Street</street> <city>New York</city> <state>NY</state> </address> <phone type="home">212-555-1234</phone> </person>
AXON реализует идею более простого синтаксиса для представления XML структурированных данных:
person { name {"John Smith"} age {25} address { type: "home" street {"21 2nd Street"} city {"New York"} state {"NY"} } phone {type:"home" "212-555-1234"} }
Представление в формате AXON можно построить из формата XML за 5 шагов:
- Заменить
<tag>наtag { - Заменить
</tag>на} - Заменить
attr=valueнаattr: value - Текст внутри элементов заключить в двойные кавычки (
") - Удалить символ запятой (
,) или заменить его на один пробел
Результат такого преобразования структурно идентичен первоначальному XML документу. По-существу это синтаксически более компактная форма представления XML документа.
Для сравнения также приведем представление в AXON с форматированием сложных элементов без {} с использованием принципа одинакового отступа для подэлементов структуры:
person name {"John Smith"} age {25} address type: "home" street {"21 2nd Street"} city {"New York"} state {"NY"} phone type: "home" "212-555-1234"
Это представление получается из предыдущего удалением всех символов { и }, а также ненужных пустых строк.
AXON расширяет возможности XML и JSON
В XML атрибуты могут иметь только простые значения, в AXON значением атрибута может любое значение (как и в JSON). Кроме того простые значения имеют тип (текст в формате unicode, число, десятичное число, дата и время, массив байтов в кодировке base64). AXON можно рассматривать как расширение JSON в том смысле, что объекты могут именованными, так же как и элементы XML являются именованными.
Например:
person name: "John Smith" age: 25 burn: 1975-10-21 locations: [ address type: "home" street: "21 2nd Street" city: "New York" state: "NY" ] contacts: [ phone type: "home" "212-555-1234" email type: "personal" "mail@example.com" ]
В JSON есть одно неудобство, связанное с представлением нерегулярных структур, в которых существенен порядок частей. В таких структурах доступ к элементам осуществляется в результате последовательного поиска по имени, а не в результате "прямого" доступа по имени.
В качестве примера рассмотрим структурированный документ в формате XML:
<section title="Title"> <par style="normal">paragraph</par> <enumerate style="enum"> <item>item text</item> </enumerate> <par style="normal">paragraph</par> <itemize style="itemize"> <item>item text</item> </itemize> <par style="normal">paragraph</par> </section>
Непосредственно, без преобразования структуры этот документ не транслируется в JSON из-за важности порядка и повторяемости элементов. Один вариант трансляции, который эмулирует последовательность именованных элементов имеет вид:
{ "tag": "section", "@": {"title": "Title"}, "*": [ { "tag": "par", "@": {"style":"normal", "text":"paragraph"}}, { "tag":"enumerate", "@": {"style": "enumerate"}, "*": [ { "tag":"item", "@": {"text":"item text"}} ] }, { "tag": "par", "@": {"style":"normal", "text":"paragraph"}}, { "tag":"itemize", "*": [ { "tag":"item", "@": {"text":"item text"}} ] }, { "tag": "par", "@": {"style":"normal", "text":"paragraph"}} ] }
В AXON такие структуры транслируются "один в один":
section title: "Title" par style: "normal" "paragraph" enumerate style: "enum" item { "item text" } par style: "normal" "paragraph" itemize style: "itemize" item { "Item text" } par style: "normal" "paragraph"
AXON поддерживает форматирование в стиле YAML
Привлекательной стороной YAML является формат представления в стиле wiki. AXON также поддерживает подобный стиль форматирования.
Например, для сравнения:
- форматирование без {} (
YAML-стиль)
person name: "Alex" age: 25
- форматирование с {} и отступами (
C/JSON-стиль)
person { name: "Alex" age: 25}
- компактный формат
person{name:"Alex" age:25}
AXON может представлять серию объектов
Одно из ограничений JSON и XML связано с тем, что они представляют единственный корневой объект. Напротив, AXON представляет серию объектов или серию пар ключ:объект, которые можно загружать по одному. Например:
- серия объектов
{ name: "Alex" age: 32 } { name: "Michael" age: 28 } { name: "Nick" age: 19 }
- серия объектов с ключами
alex: { message: "Hello" datetime: ^2015-07-12T12:32:35 } michael: { message: "How are you" datetime: ^2015-07-12T12:32:35 }