AXON это нотация для сериализованного представления объектов, документов и данных в текстовой форме. Она объединяет в себе простоту JSON, расширяемость XML и удобочитаемость YAML.
Есть проект pyaxon на python с которым можно "поиграться". Впрочем, он создавался таким образом, чтобы не сильно уступать по скорости с модулем json. Поэтому он может сгодиться и для реальных дел.
AXON
появился как попытка справиться с недостатками или неудобствами JSON
и XML
, но сохранить при этом их достоинства и возможности, дополнительно добавив удобочитаемость, присущую YAML
.
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
).
Рассмотрим иллюстративный пример 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"
Это представление получается из предыдущего удалением всех символов { и }, а также ненужных пустых строк.
В 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"
Привлекательной стороной YAML
является формат представления в стиле wiki
. AXON
также поддерживает подобный стиль форматирования.
Например, для сравнения:
YAML
-стиль)person
name: "Alex"
age: 25
C/JSON
-стиль)person {
name: "Alex"
age: 25}
person{name:"Alex" age:25}
Одно из ограничений 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
}
In [ ]: