Jsondoc начинал как Bsondoc.PAS и IBSONDocument в проекте TmongoWire. Поскольку это был солидный анализатор JSON, основанный на iunknowns (для подсчета ссылок) и вариантов (я действительно, действительно ненавижу длинные списки перегрузки для Allkinds of Tipes). Потребность возникла для манипулирования JSON в нескольких проектах, не связанных с MongoDB, поэтому эта идея появилась, чтобы иметь специальный проект вокруг IJSONDocument .
(Чтобы завершить ход, с тех пор TmongoWire заменил bsonDoc.pas на jsonDoc.pas и отдельные функции преобразования для преобразования из BSON и в BSON.)
Чтобы создать новый экземпляр IJSONDocument :
function JSON: IJSONDocument; overload;
Чтобы создать и заполнить новый экземпляр IJSONDocument :
function JSON(const x: array of Variant): IJSONDocument; overload;
Передайте список ключей и значений альтернативных ключей, суффикс клавиша с { для запуска встроенного документа и используйте клавишу } , чтобы закрыть его. Например: с
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
d.ToString вернется {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true} .
Преобразовать вариант в ссылку на IJSondocument.
function JSON(x: Variant): IJSONDocument; overload;
В зависимости от значения аргумента:
IJSONDocument ,nil ,IJSONDocument . Объедините строку с данными JSON в экземпляр IJSONDocument , существующие ключи будут перезаписаны их значения (см. Clear ниже).
function Parse(const JSONData: WideString): IJSONDocument;
Преобразовать данные в экземпляре IJSONDocument в строку JSON.
function ToString: WideString;
Преобразуйте данные в случае IJSONDocument в вариант массива размеров [0 .. N , 0..1], где [ i , 0] содержит ключи и [ i , 1] содержит значения.
function ToVarArray: Variant;
Очистите значения IJSONDocument , но сохраните список ключей.
procedure Clear;
При обработке последовательности документов JSON с аналогичным набором клавиш (и ключей со встроенных документов) можно получить производительность, избегая сокращения и повторного распределения памяти для хранения ключей (и записи варианта для их значений). (См. Также IJSONDocArray ниже).
Получить значение по ключу. Это свойство по умолчанию, поэтому вы можете получить доступ к ключам IJSONDocument с помощью индексной нотации (например: d['id'] ).
property Item[const Key: WideString]: Variant; default;
Внимание: По умолчанию реализация IJSONDocument : TJSONDocument не является потоком. Пожалуйста, используйте правильные методы блокировки и синхронизации, чтобы гарантировать, что только один поток обращается к экземпляру за один раз, или объявить условное определение JSONDOC_THREADSAFE .
Создайте экземпляр IJSONEnumerator для ссылки IJSONDocument .
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
Проверьте, проходит ли перечисление от конца набора клавиш документа.
function EOF: boolean;
Переместите итератор на следующий элемент в наборе. Перемещает итератор в первый элемент на первом вызове. Возвращает ложь при перемещении через конец набора.
function Next: boolean;
Возвращает ключ или значение текущего элемента в наборе.
function Key: WideString;
function Value: Variant;
Возвращает ключ или значение текущего элемента в наборе.
Используйте экземпляр IJSONDocArray , чтобы хранить набор аналогичных документов JSON. JSON конвертируется в и из строк внутренне, чтобы сохранить использование памяти. Используйте LoadItem с одним экземпляром IJSONDocument для повторного использования клавиш и сохраните при распределении памяти. Предварительно загрузите родительского IJSONDocument с помощью экземпляра IJSONDocArray , чтобы отложить некоторые из документов об анализе детей.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
Добавить документ в массив.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
Получите документ, используя существующий экземпляр IJSONDocument , возможно, повторно используя выделенные клавиши.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
Получить количество документов в массиве.
function Count: integer; stdcall;
Преобразовать данные в экземпляре IJSONDocArray в строку JSON.
function ToString: WideString; stdcall;
Получить документ по индексу в новом экземпляре IJSONDocument . Это свойство по умолчанию, поэтому вы можете использовать индексную нотацию (например: a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
Если вам нужно обрабатывать документы, которые содержат много и/или больших массивов, некоторые производительность может быть потеряна, потому что манипулирующие варианты массивов выполняют глубокую копию по назначению по умолчанию.
Чтобы предотвратить это, установите значение JSON_UseIJSONArray в True, чтобы IJSONDocument использовал экземпляры IJSONArray для хранения массивов, которые используют отсчет справочника вместо глубокой копии при задании.
Недостатком этого является то, что простая индексация массива ( a[i] ) больше не работает. ( VariantManager , который может обеспечить поддержку для этого, устанавливается в Delphi с момента версии 7.) Используйте функцию ja , чтобы удобно извлечь ссылку IJSONArray из переменной типа ( ja(a)[i] ).