Стиль JSON

Предназначен для вывода Pm в виде JSON.

В этом описании контекстом называется узел дерева разбора, порождаемый [] или {} скобками, притом в [] скобках об объектах, которые непосредственно в [], говорится, что они в контексте массива, а объекты, которые непосредственно в {} скобках, в контексте структуры. Объекты, имеющие простой тип (строка, число, bool), будем называть скалярами. Это условные названия.

Начало стиля:

#name json [-bBcCeEHkLmMosT] [-,{[] [-> SHIFT] [-| LEVEL]
       
Здесь name -- какой либо идентификатор, по нему стиль будет выбран командой #style.

Порядок флагов неважен. Первая группа флагов соответствует recobe(1), относится к перекодированию каждого идентификатора или текстового объекта при выводе. Некоторые из этих флагов имеют аргумент, здесь не описан, см. recobe(1). Справку по этим флагам выдает команда recobe -? и далее recobe -?c, recobe -?k, recobe -?s, recobe -?m.

Остальные флаги:

-,
- Если стиль задает не весь JSON или не начало его, то этот флаг обозначает, что первый значащий символ будет запятая.
-[
- Если стиль задает не весь JSON или не начало его, то этот флаг обозначает, что контекст в начале описываемого этим стилем - массив.
-{
- Если стиль задает не весь JSON или не начало его, то этот флаг обозначает, что контекст в начале описываемого этим стилем - структура.
-| LEVEL
- Если стиль задает не весь JSON или не начало его, то этот флаг обозначает начальный уровень вложенности выводимого этим стилем дерева. По умолчанию 0 == LEVEL, что обозначает, что этот стиль управляет началом вывода JSON (возможно до конца), и в этом случае понятие контекста неприменимо.
-> SHIFT
- Задает смещение при выводе объектов относительно объектов на предыдущем уровне. Каждой значащей строке стиля соответствует строка в выводе, если разрешает условие вывода. По умолчанию или если 0 == SHIFT, вывод происходит без деления на строки и смещения.

После первой строки с именем и параметрами в стиле, который описывает JSON целиком, должна стоять строка с открывающей скобкой [ или {, которая задает контекст для следующих строк в этом узле JSON дерева. Эта первая открывающаяя скобка не имеет контекста. Последующие открывающие скобки, если они в { контексте, обязательно должны иметь идентификатор перед скобкой.

Например:

{
  id [
       
{
  id {
       
[
  [
       
[
  {
       

Каждой открывающей скобке в полном JSON объекте должна соответствовать закрывающая скобка, ничего, кроме скобки и разделителей, в этой строке быть не должно.

Например:

  ]
       
  }
       

Остальные строки задают скаляры, ниже таблица, показывающая, как интерпретируются строки стиля в зависимости от содержимого строки:

Строки скаляров Контекст
{ [
null "null" : "@null" null
true "true" : "@true" true
false "false": "@false" false
nm "nm" : "@nm"
@nm @nm
"nm" "nm" : "@nm" "nm"
@"nm" @nm
1 "*1" : "@1" 1
@1 @1
nm null "nm" : null
nm true "nm" : true
nm false "nm" : false
nm "id" "nm" : "id"
nm @id "nm" : "@id"
nm 2 "nm" : 2
nm @2 "nm" : "@2"
@nm null "@nm" : null
@nm true "@nm" : true
@nm false "@nm" : false
@nm "id" "@nm" : "id"
@nm @id "@nm" : "@id"
@nm 2 "@nm" : 2
@nm @2 "@nm" : "@2"
1 null "*1" : null
1 true "*1" : true
1 false "*1" : false
1 "id" "*1" : "id"
1 @id "*1" : "@id"
1 2 "*1" : 2
1 @2 "*1" : "@2"
@1 null "@1" : null
@1 true "@1" : true
@1 false "@1" : false
@1 "id" "@1" : "id"
@1 @id "@1" : "@id"
@1 2 "@1" : 2
@1 @2 "@1" : "@2"
Здесь id и nm - какие-либо идентификаторы, 1 и 2 - какие-либо неотрицательные целые, пустое поле обозначает недопустимость строки из левой колонки в соответствующем контексте. остальные символы обозначают сами себя. Кроме того, выводится запятая перед выходной строкой, где необходимо. Везде в левой колонке, где стоит nm без кавычек, можно использовать его же в кавычках ("nm"), аналогично можно поступать с id.

В колонке str показана строка, которая будет выведена в { контексте по строке стиля из левой колонки с точностью до форматирования, В колонке arr показана строка, которая будет выведена в [ контексте по строке стиля из левой колонки с точностью до форматирования.

Условные обозначения:

*1
(1 - некоторое неотрицательное число) выводится имя поля с указанным номером.
@X
выводится текст из поля с номером или именем X.

В конце каждой строки, кроме строки с закрывающей скобкой, может стоять спецификатор, состоящий из необязательного символа начала цикла и необязательного типа.

=
начало цикла
*
тип text, выводится текст в кавычках, производится экранирование.
#
тип число, выводится число без кавычек.
.
тип bool, выводится true или false.

Символ начала цикла может стоять в только одной строке после [ скобки и обозначает, что каждая строка входной выборки будет выводиться в в соответствии с описанием внутри пары этой скобки и соответствующей ей закрывающей. Строки перед [ = строкой заполняются из первой строки входной выборки, строки после закрывающей скобки цикла, заполняются из последней строки входной выборки. Если такой пометки нет, выводится только первая строка Pm.

Пометка типа после открывающей скобки ([ или {) задает дефолтный тип скаляров внутри скобок, если тип не помечен явно. Если тип помечен в нескольких уровнях, приоритетен ближайший. Если символ типа стоит после скаляра, он задает тип текущего скаляра и имеет приоритет перед типом, заданным открывающей скобкой. Если тип не задан, делается запрос к входной выборке Pm о типе поля с целью сопоставить ему JSON тип. В зависимости от СУБД, от которой получена выборка, возможны сюрпризы. Если во входной выборке нет заданного поля или значение в нем NULL, то выводится null в качестве значения, если строка не помечена как необязятельная (см. ниже ?.... обозначения).

В начале строки перед разделителем может стоять ?, ?1, ?id, где обозначение 1 и id такое же, как и в левой колонке таблицы (то есть можно ?"id"). Одинокий вопросительный знак у скаляра обозначает, что если его значение null, то вся строка не выводится, у открывающей скобки одинокий вопросительный знак обозначает, что весь узел не выводится, если в нем нет ни одной выводимой строки, закрывающая скобка при этом тоже не выводится.

Если вопросительный знак сопровождается целым числом или идентификатором, то соответствующая строчка или узел выводятся только если указанное поле (по номеру или по названию) существует и не NULL.

Нумерация полей выборки в Pm может зависеть от СУБД, обычно считаются слева направо, начиная с 0.

Разделителями внутри строки являются пробел, табуляция, запятая и двоеточие. То есть символы , и : не значат ничего, кроме разделения, их можно употреблять исходя из эстетики и читаемости.

Пример

[                     =
  , {
    , platform      "Potus"
    , 1           :   #
      "version"       *
      instance_id     *
    , "event_type":   .
    , "event_id":   
    , "event_desc":   *
    , "params"    : {
      , excode      0 #
?1    , "сhop"    :   *
?     , "tag"     :   *
      }
?   , "data":{
?     , "json"    :   *
    }
  }
]
       


А.А.Бабайлов (C)2003..2022