Что такое AXON

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 шагов:

  1. Заменить <tag> на tag {
  2. Заменить </tag> на }
  3. Заменить attr=value на attr: value
  4. Текст внутри элементов заключить в двойные кавычки (")
  5. Удалить символ запятой (,) или заменить его на один пробел

Результат такого преобразования структурно идентичен первоначальному 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
}

In [ ]: