powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TreeView в JSON
4 сообщений из 4, страница 1 из 1
TreeView в JSON
    #39972028
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрых суток,

Может у кого есть уже готовый код для превращения структуры дерева и его значений в JSON файл и обратно?
...
Рейтинг: 0 / 0
TreeView в JSON
    #39972046
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TreeView в JSON
    #39972110
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник


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

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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;
...
Рейтинг: 0 / 0
TreeView в JSON
    #39972949
FIL23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как и обещал обратный парсер.

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
//эта процедура для 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;
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TreeView в JSON
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]