Що таке 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
підтримує синтаксис для представлення дати і часу
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.14 D 1.23 e-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 містить варіант моделі XML Infoset в більш компактній нотації

Розглянемо ілюстративний приклад
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" вік:25}

AXON може представляти серію об'єктів
Одне з обмежень
JSON
та
XML
пов'язано з тим, що вони являють єдиний кореневий об'єкт. Навпаки,
AXON
представляє серію об'єктів або серію пар
ключ
:
об'єкт
, які можна завантажувати по одному. Наприклад:
  • серія об'єктів
{ name: "Alex"
age: 32 }
{ name: "Michael"
age: 28 }
{ name: "Nick"
age: 19 }

  • серія об'єктів з ключами
alex: {
message: "Привіт"
datetime: ^2015-07-12T12:32:35
}
michael: {
message: "How are you"
datetime: ^2015-07-12T12:32:35
}

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.