Работа с JSON-данными
Вашему приложению может не понадобиться записывать все данные в файл JSON, поэтому вы можете настроить способ чтения или записи JSON-данных.
Далее вы узнаете, как:
- записать данные дочерней таблицы в виде вложенных элементов JSON;
- указать в файле JSON имена, отличные от тех, которые описаны в наборе данных;
- записать подмножество полей временной таблицы в файл JSON.
Запись вложенных данных в файл JSON
По умолчанию при записи набора данных в файл JSON в него записывается вся родительская таблица, а затем каждая дочерняя таблица. Для приложений, которые получают ваши данные, это может быть нежелательная структура. Поэтому если необходимо записать данные в файл JSON таким образом, чтобы была записана каждая родительская запись, а затем все связанные дочерние записи, то требуется явно установить вложенную связь данных. Для этого необходимо установить атрибут отношения NESTED в значение true. Обратите внимание, что вам не нужно устанавливать этот атрибут для чтения вложенных JSON-данных. Вы можете прочитать JSON-файл с вложенными таблицами или без них.
{"dsPO": {
"ttPurchaseOrder": [
{
"PONum": 8001,
"DateEntered": "1998-05-05T00:00:00.000",
"SupplierIDNum": 1,
"ReceiveDate": "1998-07-29",
"POStatus": "Received",
"POTotal": 18708.7,
"ttPOLine": [
{
"Linenum": 1,
"Itemnum": 3,
"Price": 16.55,
"Qty": 63,
"Discount": 30,
"ExtendedPrice": 729.86,
"PONum": 8001,
"POLineStatus": "Received"
}…
Синтаксис установки атрибута NESTED:
<ds-handle>:GET-RELATION("<rel-name>" | <rel-index>):NESTED = TRUE.
Здесь,
- <ds-handle> – дескриптор набора данных.
- <rel-name> – имя родительского / дочернего отношения, которое было ранее определено для набора данных.
- <rel-index> – индекс отношения данных для набора данных, где первое отношение данных имеет значение индекса 1.
В этом примере отношение данных с именем Order-to-OrderLine определяется как вложенное, поэтому при записи данных в файл JSON в него будут вложены записи дочерних таблиц.
DATASET dsPO:GET-RELATION("Order-to-OrderLine"):NESTED = TRUE.
В следующем примере отношение данных для набора данных не имеет имени. Поэтому мы указываем значение индекса 2 для отношения данных, чтобы указать, что мы вкладываем второе отношение данных, определенное для набора данных:
DATASET dsPO:GET-RELATION(2):NESTED = TRUE.
Использование отличающихся имён в файле JSON

В ABL-приложении, которое обменивается данными со сторонними приложениями, общей проблемой является размер сообщений, которыми они обмениваются. Если имена элементов в файле JSON длинные, то это увеличивает размер объекта JSON, который передаётся, например, сообщениями HTTP. Поэтому разработчики приложений могут договориться о сокращении имён, чтобы уменьшить размер сообщений.
Вы можете использовать разные имена в файле JSON и в наборе данных, когда приложение читает или записывает данные JSON. Сопоставление имён может быть задано для:
- названий наборов данных;
- названий временных таблиц;
- названий полей.
Имена, используемые для данных JSON, зависят от протокола, который вы устанавливаете с внешними приложениями, и с которыми обмениваетесь данными JSON. Следующий синтаксис используется для сопоставления имени, которое используется в данных JSON, с именем в определении набора данных. Такое сопоставление можно использовать как для записи, так и для чтения JSON. Эти инструкции необходимо поместить в код перед вызовом методов READ-JSON или WRITE-JSON.
<data-type> <ds-obj-ref>:SERIALIZE-NAME = "<name>".
Здесь,
- <data-type> – тип компонента набора данных, который хотите сопоставить с элементом данных JSON. Это может быть DATASET, TEMP-TABLE или BUFFER.
- <ds-obj-ref> – ссылка на объект, используемый для сопоставления.
- <name> – имя, которое будет записано в файл JSON, или имя, которое будет считано из файла JSON для уже определённого объекта.
Следующий пример демонстрирует использование сопоставления имён для набора данных, двух временных таблиц и двух полей временных таблиц, которые будут отличаться в JSON-файле. Эти операторы должны быть помещены перед вызовом READ-JSON или WRITE-JSON.
DATASET dsOrderOrderLine:SERIALIZE-NAME = "OrdersOrderLines".
TEMP-TABLE ttOrder:SERIALIZE-NAME = "Orders".
TEMP-TABLE ttOrderLine:SERIALIZE-NAME = "OrderLines".
BUFFER ttOrder:BUFFER-FIELD("WarehouseNum"):SERIALIZE-NAME = "WHNum".
BUFFER ttOrder:BUFFER-FIELD("Instructions"):SERIALIZE-NAME = "Instr".
Запись подмножества полей временной таблицы в JSON-файл
При обмене данными JSON может потребоваться уменьшить размер объекта JSON, оставив только те поля, которые требуются приложению, что приводит к повышению производительности сети.
Исключить поле из записи в файл JSON можно с помощью следующего синтаксиса:
BUFFER <tt-name>:BUFFER-FIELD("<fld-name>"):SERIALIZE-HIDDEN = TRUE.
Здесь,
- <tt-name> – название временной таблицы.
- <fld-name> – название поля временной таблицы.
Инструкция должна быть помещена в код перед вызовом метода WRITE-JSON.
В следующем примере поле CreditCard из таблицы ttOrder не будет записано в файл JSON во время вызова метода WRITE-JSON.
BUFFER ttOrder:BUFFER-FIELD("CreditCard"):SERIALIZE-HIDDEN = TRUE.
