Формат XML для представления значения JSON
JSON значение может быть представлено XML специальной структуры, т.к. для работы с XML имеются средства как в Инфо-Бухгалтер 10, так и Инфо-Бухгалтер 8. Такой подход не требует создания аналогичного семейства функций для работы с JSON.
При работе с JSON возникают две задачи:
- Извлечение данных из полученного JSON (например, присланного веб-сайтом);
- Формирование данных и представление их в формате JSON (например, для последующей отправки веб-сайту).
Структура XML должна представлять значения разных типов: объекты, массивы, числа и др. Преобразование из JSON в XML и обратно должно выполняться без потерь.
Корневой элемент XML имеет имя json. В каждом элементе XML может быть атрибут type описывающий тип соответствующего JSON-значения. Допускается отсутствие этого атрибута для значений строкового типа (принцип "строки по умолчанию" для сокращения объема XML). Атрибут type может принимать следующие значения:
- null – специальное пустое значение, XML элемент не содержит текста;
- string – строка, это значение можно не указывать;
- int – целое число со знаком;
- uint – целое число без знака;
- real – вещественное число;
- boolean – логическое значение, текст true или false;
- array – массив, дочерние XML элементы имеют имя item;
- object – object, дочерние XML элементы имеют имeна полей (members) объекта.
Когда имя поля не является допустимым именем для элемента XML, элемент получает имя complex_object_key, а имя поля JSON помещается в атрибут key.
Строковые значения могут сохраняться в XML в двух вариантах. Простые строки, не содержащие специальных символов, а также пробельных символов в начале или конце, сохраняются в текст XML элемента непосредственно. Другие строки, например многострочный текст, кодируются по правилам JSON. Кодирование заключается в том, что текст заключается в кавычки, а специальные символы и символы кавычки, обратного слэша экранируются. Если XML элемент содержит кодированный текст, то он должен иметь атрибут quoted="true". При чтении данных из XML необходимо проверять атрибут quoted и, при обнаружении значения "true", выполнять декодирование текста.