SaveJSONToString

From SunFlurry wiki
Jump to: navigation, search
  SaveJSONToString (Функции работы со строками)
Статус разработки: Частичная реализация
Тип:Функция
Обращение к БД:Нет
Исключения:Неверный входящий объект
Визуальность:Нет

Функция экспортирует (превращает) объект дерева, ветки или списка в текст JSON. Функция позволяет восстановить JSON документ из объекта, который обмено создается с помощью функции LoadJSONFromString. Обычно необходимо модифицировать объект перед превращением его в текст, при модификации (удалении или добавлении веток или списков) нужно руководствоваться следующими правилами, чтобы получить корректный конечный результат:

  • При экспорте дерева к строке-результату будут добавлены символы { и }. При экспорте списка они будут добавлены, если результат уже не является массивом. При экспорте ветки дерева результат не будет модифицирован.
  • И для дерева и для списка при экпорте используется поле Check (Tree.Checked, List.Check). Это поле может иметь следующие значения:
    • Для веток, содержащих подчиненные ветки или для элементов списков, значением которых является список, в случае, если это поле равно 0, будут включенные элементы будут считаться объектом JSON ({ и }), если поле равно единице, они будут считаться массивом ([ и ]). Это позволяет корректно отличить пустой объект {} от пустого массива [].
    • Для остальных веток поле Check (Tree.Checked, List.Check) используется для указания типа объекта, если объект является строкой. Если поле равно нулю, экспортируемое строковое значение будет заключено в кавычки и перекодировано в формат JSON (см. EncodeString), т.е. "Имя":"<Перекодированное значение>". Если поле не равно нулю, перекодирование и кавычки добавлены не будут, т.е. "Имя":<Значение>. Данная возможность используется для корректного сохранения особых значений типа true, false и null.
  • Поле Check для строковых значений также можно использовать для быстрой вставки в объект массива или объекта JSON, заданного в виде строки. Так как в случае Check<>0 перекодирование производиться не будет, результат будет выглядеть, как корректный объект или массив JSON без необходимости его предварительного превращения в ветки дерева или списки (см. пример ниже).

Синтаксис

SaveJSONToString(<Объект дерева, ветки или списка (STRING)>):<Результат (STRING)>

Возвращаемое значение

Будет возвращено строковое значение.

Примеры

//"Отпечаток" сертификата (здесь дан для примера) 
пОтпечаток:="ABC123";

//Загрузка простого объекта JSON
Стр:="{""Результат"":{""Вложения"":[{""Файл"":{""Имя"":""Файл1"",""Тип"":0},""Удален"":0},{""Файл"":{""Имя"":""Файл2"",""Тип"":1},""Удален"":1},{""Файл"":{""Имя"":""Файл3"",""Тип"":2},""Удален"":0}]}}";
aTree:=LoadJSONFromString(Стр,0);
aBr:=aTree["Результат","Вложения"];
If _And(TypeStr(aBr)="TREE.BRANCH",aBr.Size()>0) Then
  For i:=1 to aBr.Size() Do
    //Получим ветку текущего вложения по его индексу
    aBr2:=aBr.ByIndex(i);
    //Удалим ветку файл в текущем вложении
    aBr3:=aBr2.FindByName("Файл");
    If not IsEmpty(aBr3) Then
      aBr2.Remove(aBr3.Index);
    EndIf;

    //Добавим ветку подпись, как массив, добавим объект сертификат в первый элемент массива
    aBr3:=aBr2.Add(,"Подпись");
    //Указание на то, что это массив объектов (здесь не обязательно)
    aBr3.Checked:=1;
    //Добавим новую ветку в массив
    aBr3:=aBr3.Add();
    //Добавим заранее подготовленный кусок JSON
    aBr4:=aBr3.Add("{""Отпечаток"":"""+EncodeString(пОтпечаток,"JSON")+"""}","Cертификат");
    //Указание на то, что текст нельзя перекодировать, а необходимо использовать "как есть"
    aBr4.Checked:=1;
  EndDo;
EndIf;

Стр:=SaveJSONToString(aTree);
//Будет выведено: {"Результат":{"Вложения":[{"Удален":0,"Подпись":[{"Cертификат":{"Отпечаток":"ABC123"}}]},
//                {"Удален":1,"Подпись":[{"Cертификат":{"Отпечаток":"ABC123"}}]},{"Удален":0,"Подпись":[{"Cертификат":{"Отпечаток":"ABC123"}}]}]}}
Message(Стр);
//Мы смогли не только удалить нужные ветки, но и добавить целые куски текста JSON без необходимости в более трудоемком добавлении веток.