Работа с 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.