SimpLight поддерживает работу с JSON-документами в своих скриптах. Основные типы для работы с JSON-форматом это TjsonObject и TJsonArray:
TjsonObject, TJsonArray |
Работа с объектами |
TjsonObject представляет JSON-объект. Объект хранит множество полей, значения которых можно получить по имени поля. Создать объект можно так:
json := TJsonObject.Create; |
После получения объекта можно создать новое поле для него. Присвоим значение «SimpLight» типа string полю наименованием «brand».
json.S['brand'] := 'SimpLight'; |
Можно также получить значение поля и присвоить его какой-либо переменной.
objectBrand := json.S['brand']; |
Следует заметить, что поле создается неявно при обращении к нему, а именно: при получении значения поля, или при установке значения поля. Обращение к полям происходит через использование свойств объекта, которое начинается с первой буквы типа, и квадратных скобок с именем поля. В таблице 1 приведен список типов и их сокращений, используемых в именах свойств.
Тип данных | Имя свойства |
---|---|
String | S |
Integer | I |
Int64 | L |
UInt64 | U |
Double | F |
TDateTime | D |
TDateTime | DUtc |
Boolean | B |
Array | A |
Object | O |
Variant | V |
Таблица 1. Типы данных JSON и имя свойств объектов, массивов.
В таблице стоит обратить внимание на свойство DUtc, с его помощью можно получать дату и время в стандарте UTC.
Проверить наличие поля у объекта можно, используя метод Contains, указав имя поля:
if json.Contains('color') then DoOnTrue; |
Узнать тип поля объекта можно с помощью свойства Types. Например:
lType := json.Types['brand']; // lType будет содержать перечисление jdtString |
Название метода | Описание метода |
---|---|
Assign(ASource: TJsonObject) | Присвоение полей переданного объекта с удалением полей целевому объекту |
Clear | Очистка полей целевого объекта |
Remove(Name: string) | Удаление поля по имени целевого объекта |
Delete(Index: Integer) | Удаление поля по индексу целевого объекта |
IndexOf(Name: string): Boolean | Метод возвращает индекс поля по его имени. Если поле отсутствует, то возвращает -1 |
Contains(Name: string): Boolean | Метод проверки наличия поля по имени |
Extract(Name: string): TJsonBaseObject | Позволяет извлечь поле типа объект или массив по имени. Извлечение приводит к удалению поля из объекта и позволяет обрабатывать значение поля вне зависимости от остального документа. Возникает необходимость освободить память вручную для возвращенного значения. |
ExtractArray(Name: string): TJsonArray | Позволяет извлечь поле типа массив. Работает аналогично методу Extract. |
ExtractObject(Name: string): TJsonObject | Позволяет извлечь поле типа объект. Работает аналогично методу Extract. |
IsNull(Name: string): Boolean | Метод позволяет узнать является ли поле равно null (nil в Паскале). Если поле отсутствует, то возвращает True. Если тип поля объект и оно равно nil, то возвращает True. Если у поля тип не объект, то возвращает False. |
Таблица 2. Методы типа TJsonObject.
Название свойства | Описание |
Types[Name: string]: TJsonDataType | Тип поля по указанному имени поля. |
Count: Integer | Количество полей, принадлежащих объекту. Только для чтения. |
Capacity: Integer | Показывает сколько мест выделено для полей. Свойство увеличивается самостоятельно по мере наполнения объекта полями. |
Таблица 3. Свойства типа TJsonObject.
Работа с массивами |
TjsonArray представляет JSON массив. Массив – это тип данных, который последовательно хранит значения и позволяет обратиться к конкретному элементу по индексу.
Массив можно создать следующим образом:
json := TJsonArray.Create; |
TjsonArray способен обрабатывать значения различных типов. Наполнить массив можно так:
json.Add(67); json.AddS('Мама'); json.AddS('мыла'); json.AddS('раму'); |
Добавить элементы массива можно с помощью метода Add принимающий тип Variant или метод с конкретным типом Add добавив букву типа из Таблицы 1.
После того как массив был наполнен можно его обойти. Обход выполняется с помощью цикла while и индекса.
i := 0; while i < json.Count do begin strValue := json.S[i]; Inc(i); end; |
Заметим, что при доступе к элементу с помощью индекса явно указывается тип значения, к которому будет приведено значения элемента массива, в виде свойства. Похожий механизм используется в TJsonObject для доступа к полям объекта.
Название метода | Описание метода |
Assign(ASource: TJsonArray) | Присвоение полей переданного массива с удалением элементов целевого объекта. |
AddT(AValue: K) | Позволяет добавить значение в массив, где T – первая буква тип данных, K – тип данных. см. Таблица 1. |
AddUtcDateTime(AValue: TDateTime) | Добавляет дату и время по часовому поясу UTC в массив. |
AddArray: TJsonArray | Добавляет новый массив в текущий массив и возвращает его. |
AddObject: TJsonObject | Добавляет новый объект в текущий массив и возвращает его. |
InsertT(Index: T; Value: K) | Вставка нового элемента в массив, где T – первая буква тип данных, K – тип данных. см. Таблица 1. |
Insert(Index: Integer; Value: Variant) | Вставка нового элемента в массив. |
InsertArray(Index: Integer): TJsonArray | Вставляет новый массив по указанному индексу и возвращает его. |
InsertObject(Index: Integer): TJsonObject | Вставляет новый объект по указанному индексу и возвращает его. |
IsNull(Index: Integer): Boolean | Метод позволяет узнать является ли элемент null (nil в Паскале). Если тип элемента объект и элемент равен nil, то возвращает True. Если у элемента тип не объект, то возвращает False. Если индекс больше или равен количеству элементов массива выбрасывается исключение. |
Таблица 4. Свойства типа TJsonArray.
Название свойства | Описание |
Types[Index: Integer]: TJsonDataType | Тип элемента массива по указанному индексу. |
Count: Integer | Количество элементов в массиве. |
Capacity: Integer | Показывает сколько мест выделено для элементов. Свойство увеличивается самостоятельно по мере наполнения массива элементами. |
Таблица 5. Свойства типа TJsonArray.
Базовый тип TJsonBaseObject |
TjsonBaseObject является базовым типом для ранее рассмотренных TjsonObject и TJsonArray. Он содержит методы которые доступны обоим упомянутым типам.
Название метода | Описание метода |
Clone: TJsonBaseObject | Позволяет создать полную копию текущего объекта. В копию включаются не только простые типы данных, но и объекты, массивы. |
LoadFromFile(FileName: string; Utf8WithoutBOM: Boolean = True) | Загрузка JSON из указанного файла по имени. Тип корневого JSON элемента должен совпадать с текущим. Иначе это приведет к исключению. Utf8WithoutBOM – если True, то считается, что файл не содержит BOM в его начале, если закодирован в UTF-8. |
LoadFromStream(Stream: TStream; Encoding: TEncoding = nil; Utf8WithoutBOM: Boolean = True) | Загрузка JSON из потока. Тип корневого JSON элемента должен совпадать с текущим. Иначе это приведет к исключению. Utf8WithoutBOM – если True, то считается, что поток не содержит BOM в его начале, если закодирован в UTF-8. |
SaveToFile(FileName: string; Compact: Boolean = True; Encoding: TEncoding = nil; Utf8WithoutBOM: Boolean = True) | Сохранение текущего объекта в файл. если Compact – True, то конечный JSON будет в виде единственной строки. Если False – с форматированием и отступами в удобочитаемом формате. |
SaveToStream(Stream: TStream; Compact: Boolean = True; Encoding: TEncoding = nil; Utf8WithoutBOM: Boolean = True) | Сохранение текущего объекта в поток. |
SaveToLines(Lines: TStrings) | Сохранение текущего объекта в экземпляр TStrings с форматированием и отступами в удобочитаемом формате. |
ToJSON(Compact: Boolean = True): string | Возвращает текущий объект в виде json-строки. Если Compact – True, то конечный JSON будет в виде единственной строки. Если False – с форматированием и отступами в удобочитаемом формате. |
Таблица 6. Методы типа TJsonBaseObject.
Существует еще набор полезных методов для работы с JSON. Они содержатся в переменной TJson.
Название метода | Описание метода |
ParseArray(S: string): TJsonArray | Возвращает JSON-массив, созданный из строки. Ожидается что корневой элемент является массивом. |
ParseArrayFromFile(FileName: string; Utf8WithoutBOM: Boolean = True): TJsonArray | Возвращает JSON-массив, загруженный из файла. Ожидается что корневой элемент JSON’а является массивом. |
ParseArrayFromStream(Stream: TStream; Encoding: TEncoding = nil; Utf8WithoutBOM: Boolean = True): TJsonArray | Возвращает JSON-массив, созданный из потока. Ожидается что корневой элемент JSON’а является массивом. |
ParseObject(S: string): TJsonObject | Возвращает JSON-объект, созданный из строки. Ожидается что корневой элемент JSON’а является объектом. |
ParseObjectFromFile(FileName: string; Utf8WithoutBOM: Boolean = True): TJsonObject | Возвращает JSON-объект, загруженный из файла. Ожидается что корневой элемент JSON’а является объект. |
ParseObjectFromStream(Stream: TStream; Encoding: TEncoding = nil; Utf8WithoutBOM: Boolean = True): TJsonObject | Возвращает JSON-объект, созданный из потока. Ожидается что корневой элемент JSON’а является массивом. |
Таблица 7. Методы объекта скриптов TJson.
Считывание из файла |
При работе со JSON-структурой из файла следует придерживаться следующей схемы
var json: TJsonObject; begin json := TJson.ParseObjectFromFile('c:\путь\до\файла.json'); try // Делаем что-нибудь finally json.Free; end; end. |
Ниже представлен полный пример работы с JSON-документом. Подготовим документ следующего вида.
Затем создаем скрипт по работе с подготовленным JSON-документом. В скрипте пройдемся по JSON-структуре и найденные адреса электронной почты запишем в другой отдельный JSON-файл.
В результате работы скрипта на жестком диске образуется новый JSON-файл (или перезаписывается существующий файл), содержащий адреса электронной почты, найденные в первичном документе "users.json".