Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TreeView в JSON  [new]
FIL23
Member

Откуда:
Сообщений: 481
Добрых суток,

Может у кого есть уже готовый код для превращения структуры дерева и его значений в JSON файл и обратно?
22 июн 20, 20:48    [22155457]     Ответить | Цитировать Сообщить модератору
 Re: TreeView в JSON  [new]
DimaBr
Member

Откуда:
Сообщений: 11710
с гугла
второй

Сообщение было отредактировано: 22 июн 20, 21:37
22 июн 20, 21:38    [22155480]     Ответить | Цитировать Сообщить модератору
 Re: TreeView в JSON  [new]
FIL23
Member

Откуда:
Сообщений: 481
DimaBr
с гугла
второй


Гуглить я умею. Основная причина данного топика, мне лень думать.

Но т.к. время дороже, и ждать особо не могу ответа который меня устроит, написал немного своего. Оставлю тут для еще более ленивых чем я

Суть кода: берем каждый корневой элемент дерева и идем вниз по этой ветке попутно составляя массив структуры. Результат выводим в мемо. Парсер напишу уже завтра.

procedure TfmGeneral.BitBtn2Click(Sender: TObject);

  //
  function AddObjectToJSONArray(N:TTreeNode;JsonObject: TJSONObject):TJSONArray;
  var
    JSONArray: TJSONArray;            //массив JSON
    JSONNestedObject: TJSONObject;    //ссылка на элемент массива JSON
    i:integer;
  begin
  JSONArray:=TJSONArray.Create;                                                   //создаем массив JSON
  N:=N.GetNext;
  while N <> nil do
    begin

    JSONArray.AddElement(TJSONObject.Create);                                     // 1. заносим в массив пустой json-объект
    JSONNestedObject:=JSONArray.Items[pred(JSONArray.Count)] as TJSONObject;      //получаем ссылку на добавленный объект
    JSONNestedObject.AddPair('ID',TJSONNumber.Create(integer(N.Data)))    //заполняем объект данными
                    .AddPair('Name',N.Text);
    if n.Count>0 then JSONNestedObject.AddPair ('Child', AddObjectToJSONArray(N,JsonObject));  //значит есть потомки

    N:=N.getNextSibling;
    end;

  result:= JSONArray;
  end;


var
  N:TTreeNode;

  JsonObject: TJSONObject;          //объект JSON
  JSONArray: TJSONArray;            //массив JSON

begin
JsonObject:=TJSONObject.Create;                                                 //создаем объект JSON
JsonObject.AddPair('typeJSON', 'TreeObjects');
JsonObject.AddPair('versionJSON', TJSONNumber.Create(255));

N:= TreeParameters.Items[0];                                                    //Указываем уровень в котором мы будем искать родителей в этом случае самый верхний
while N <> nil do                                                               //пока не пройдем все элементы этого уровня
  begin
  JsonObject.AddPair('ID',TJSONNumber.Create(integer(N.Data)))                  //заполняем объект данными поскольку это корень
            .AddPair('Name',N.Text);

  if n.Count>0 then                                                             //если есть потомки
    begin
    JSONArray:= AddObjectToJSONArray(N,JsonObject);
    JsonObject.AddPair('TreeChild', JSONArray);
    end;
  N:=N.getNextSibling;                                                          //Извлекает следующий элемент того же уровня заданного элемента
  end;

Memo1.Lines.Text:= JsonObject.Format(10) ;
end;
22 июн 20, 23:43    [22155579]     Ответить | Цитировать Сообщить модератору
 Re: TreeView в JSON  [new]
FIL23
Member

Откуда:
Сообщений: 481
Как и обещал обратный парсер.

Суть: Берем каждый элемен проверяем его и делаем корневые узлы, если это массив . запускаем функцию обработки массива которая делает дочерние узлы

//эта процедура для JvCheckTreeView так что можно не обращать на нее внимание. Тут нужна только последняя строка.
procedure tfmGeneral.SetupNode(Node: TTreeNode);
begin
TreeParameters.CheckBox[Node] := True;
Node.MakeVisible;
TreeParameters.Selected := Node;
end;


procedure TfmGeneral.BitBtn3Click(Sender: TObject);

  function ParseArray(JSONArray:TJSONArray):boolean;
  var
  i:        integer;
  JSON:     TJSONObject;
  JSONEnum: TJSONObject.TEnumerator;
  perID:string;
  N:TTreeNode;
  JSONArray2:TJSONArray   ;

    begin
    N:=TreeParameters.Selected;
    for i := 0 to Pred(JSONArray.Count) do
      begin
        JSON:=TJSONObject.Create;
        JSON:=JSONArray.Items[i].AsType<TJSONObject>;

        JSONEnum:=JSON.GetEnumerator;  //получаем доступ к перечислителю
        while JSONEnum.MoveNext do   //пока есть не перечисленные пары в json - переходим на следующую пару
          begin
          if SameText(JSONEnum.Current.JsonString.Value, 'ID') then  perID:= JSONEnum.Current.JsonValue.Value;
          if SameText(JSONEnum.Current.JsonString.Value, 'Name') then SetupNode(TreeParameters.Items.AddChildObject(N, JSONEnum.Current.JsonValue.Value,pointer(strtoint(perID))));             //создаем дочернюю ноду
          if SameText(JSONEnum.Current.JsonString.Value, 'Child') then          //тут обозначает что дальше пойдет массив
            begin
            JSONArray2:=JSONEnum.Current.JsonValue.AsType<TJSONArray >;
            ParseArray(JSONArray2);
            end;
          end;
      end;
    end;


var
JSON:           TJSONObject;
JSONEnum:       TJSONObject.TEnumerator;
JSONArray:      TJSONArray;            //массив JSON
perID: string;

begin
JSON:=TJSONObject.Create;
JSON.Parse(TEncoding.UTF8.GetBytes(memo1.text),0);

TreeParameters.ClearSelection; //снимаем фокус дабы создать корневой узел
JSONEnum:=JSON.GetEnumerator;  //получаем доступ к перечислителю
while JSONEnum.MoveNext do   //пока есть не перечисленные пары в json - переходим на следующую пару
  begin
  if SameText(JSONEnum.Current.JsonString.Value, 'ID') then  perID:= JSONEnum.Current.JsonValue.Value;
  if SameText(JSONEnum.Current.JsonString.Value, 'Name') then SetupNode(TreeParameters.Items.AddObject(TreeParameters.Selected, JSONEnum.Current.JsonValue.Value,pointer(strtoint(perID))));
  if SameText(JSONEnum.Current.JsonString.Value, 'TreeChild') then              //если встретили значение TreeChild значит это массив
    begin
    JSONArray:=JSONEnum.Current.JsonValue.AsType<TJSONArray >;
    ParseArray(JSONArray);
    TreeParameters.ClearSelection; //снимаем фокус дабы создать корневой узел
    end;
  end;
end;
24 июн 20, 23:51    [22156854]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить