Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
RAD XE3+

Как работать с JSON?

17.12.2022, 14:42. Показов 3392. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста, как можно добавлять и удалять в имеющийся JSON объекты?
К примеру такой JSON
JSON
1
{"links":[{"type":"href","description":"desc","link":"http:"},{"type":"href2","description":"desc","link":"http:"}]}
мне нужно добавить ещё
JSON
1
{"type":"href3","description":"desc","link":"http:"}
и удалить
JSON
1
{"type":"href2","description":"desc","link":"http:"}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2022, 14:42
Ответы с готовыми решениями:

Как работать с Json
Добрый день. Пытаюсь разобраться с json, подскажите пожалуйста как правильно его реализовывать? Мне нужны объекты типа: { ...

Как работать с JSON?
Здравствуйте. У меня есть вот такой JSON - текст. {"response":} Так вот, как всю информацию засунуть в переменные? То есть, в...

Как правильно работать с json?
$.ajax({ url: '../feedback.php', /*data: $('#feedbackForm').serialize(),*/ dataType: 'json', type:...

33
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
22.12.2022, 17:44  [ТС]
Студворк — интернет-сервис помощи студентам
Спасибо!

Добавлено через 1 час 6 минут
Что-то не получается скопировать
Delphi
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
unit UFMain;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  XSuperObject, Vcl.StdCtrls, Vcl.ExtCtrls, UMyJsObj;
 
type
  TForm1 = class(TForm)
    pnl1: TPanel;
    m1: TMemo;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    pnl2: TPanel;
    edt1: TEdit;
    btnCopy: TButton;
    m2: TMemo;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btnCopyClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    con : TMyContainer;
    con2 : TMyContainer;
  end;
 
 
var
  Form1: TForm1;
  json : string;
implementation
 
{$R *.dfm}
 
procedure TForm1.btn1Click(Sender: TObject);
//Добавлять
var
  item : TMyClass;
begin
  SetLength(con.links, length(con.links) + 1);
  item := TMyClass.Create;
  item._type := length(con.links).ToString;
  item.description := 'YYYYYYYYY'+length(con.links).ToString;
  item.link := 'ZZZZZZZZZZZZZ'+length(con.links).ToString;
  con.links[high(con.links)] := item;
  m1.Clear;
  m1.Lines.Text := con.AsJSON(true);
end;
 
 
 
procedure TForm1.btn2Click(Sender: TObject);
// удалять
var
  i: Integer;
begin
  con.links[0].Free;
  for i := 0 to length(con.links) - 2 do
    con.links[i] := con.links[i + 1];
  SetLength(con.links, length(con.links) - 1);
 
  m1.Clear;
  m1.Lines.Text := con.AsJSON(true);
end;
 
procedure TForm1.btn3Click(Sender: TObject);
 
begin
 
 
  edt1.Text:= con.links[1]._type
end;
 
procedure TForm1.btnCopyClick(Sender: TObject);
// копировать
var
  item : TMyClass;
begin
  SetLength(con2.links, length(con2.links) + 1);
  item := TMyClass.Create;
  item := con.links[1];
 
  con2.links2[high(con2.links2)] := item;
  m2.Clear;
  m1.Lines.Text := con.AsJSON(true);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 m1.Clear;
 m2.Clear;
 json := '{"links":[]}';
  con := TMyContainer.FromJson(JSON);
  con2 := TMyContainer.FromJson(JSON);
  m1.Lines.Add(con.AsJSON());
  m2.Lines.Add(con.AsJSON());
end;
 
end.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
23.12.2022, 11:24
а что вообще происходит тут? где копирование?
в чем задача-то состоит?
ок. вы в FormCreate создали два объекта con и con2 с одинаковыми данными
дальше что должно произойти?
смотрим код из #9
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm1.b1Click(Sender: TObject);
var
  item : TMyClass;
begin
// увеличили размер массива на единичку
  SetLength(con.links, length(con.links) + 1);
// создали новый item
  item := TMyClass.Create;
// заполнили поля Item
.....
.....
// и сохранили в конец массива
  con.links[high(con.links)] := item;
// показали результат
  m1.Lines.Text := con.AsJSON(true);
end;
если задача в том чтобы "скопировать" ОБЪЕКТ из одного массива в другой, то в реальности придется создать новый объект и все его поля заполнить из "старого". Потому что наш массив содержит ссылки на объекты и они не должны повторяться.
вот ровно на месте многоточий нужно написать что-то типа
Delphi
1
item.AssignFrom(con2.item[1]);
и написать сам метод метод AssignFrom
Delphi
1
2
3
4
5
6
7
8
9
10
11
TMyClass = class
  ....
  procedure AssignFrom(x : TMyClass);
end;
....
procedure TMyClass.AssignFrom(x : TMyClass);
begin
  _type := x._type;
  description := x.description;
  link := x.link;
end;
1
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
24.12.2022, 11:58  [ТС]
Ч тото опять не то делаю
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.btnAssingClick(Sender: TObject);
// добавить в другой
var
  item : TMyClass;
begin
 SetLength(con2.links, length(con2.links) + 1);
  item := TMyClass.Create;
  con2.links[1].AssignFrom(con.links[2]);
  con2.links[high(con2.links)] := item;
  m2.Clear;
  m2.Lines.Text := con2.AsJSON(true);
end;
Может я не правельно клас создал?

Delphi
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
type
  TMyClass = class
  private
    { private declarations }
  protected
    { protected declarations }
  public
    { public declarations }
    [Alias('type')]
    _type: string;
    description: string;
    link: string;
   procedure AssignFrom(x : TMyClass);
  published
    { published declarations }
  end;
 
  TMyContainer = class
  private
    { private declarations }
  protected
    { protected declarations }
  public
    { public declarations }
  links: TArray<TMyClass>;
  published
    { published declarations }
  end;
 
implementation
 
{ TMyClass }
 
procedure TMyClass.AssignFrom(x: TMyClass);
begin
 _type := x._type;
  description := x.description;
  link := x.link;
end;
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
24.12.2022, 12:03  [ТС]
Мне нужно 2 объект перенести в другой json
Название: 2022-12-24 110203.png
Просмотров: 142

Размер: 4.8 Кб
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
24.12.2022, 15:36
Цитата Сообщение от Vartizor Посмотреть сообщение
item := TMyClass.Create;
  con2.links[1].AssignFrom(con.links[2]);
  con2.links[high(con2.links)] := item;
внимательно прочитайте что тут происходит
вы создаете объект. ссылка на него хранится в Item
потом значения из con.links[2] присваиваете в con2.links[1]
а потом в последний элемент con2.links присваиваете новый объект item
который никто ничем не заполнял
при этом ссылка на тот объект, который там ранее лежал, потеряна, т.е. налицо будущая утечка памяти, т.к. никто этот объект разрушать уж точно не будет
что это было вообще? как это связано с "переносом"?


вам нужно перестать тыкать произвольные клавиши и разработать алгоритм
который разложен на ОПЕРАЦИИ которые вы хотите производить над массивами
и сделать ПРОЦЕДУРЫ, реализующие эти операции
тем более, что все уже практически готово в коде

вот две операции - удаление и вставка
Кликните здесь для просмотра всего текста
Delphi
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
//удаление элемента массива
procedure DeleteItemFromArray(arr:TArray<TMyClass>; Index : integer);
var
  i: Integer;
begin
  if (index < 0) or (index >= length(arr)) then
    exit;
  arr[index].Free;
  for i := index to length(arr) - 2 do
    arr[i] := arr[i + 1];
  SetLength(arr, length(arr) - 1);
  m1.Lines.Text := con.AsJSON(true);
end;
 
//вставка элемента в массив
procedure InsertItemInArray(arr:TArray<TMyClass>; Index : integer; Item : TMyClass)
var
  i : integer;
begin
  if (index < 0) or (index > length(arr)) then
    exit;
// увеличили размер массива на единичку
  SetLength(arr, length(arr) + 1);
// раздвинули массив в нужном месте
  for i := index to length(arr) - 2 do
    arr[i+1] := arr[i];
// присвоили новый элемент
  arr[index] := item;
end;


теперь нужно писать алгоритм
что такое "ПЕРЕНЕСТИ" объект из массива1 в массив2?
(это не единственный вариант, но тот, который подходит под методы выше)
1. создать новый item
2. скопировать в него данные из массива 1
3. вставить новый элемент в массив 2
4. удалить старый элемент из массива 1
собственно 4 ПОНЯТНЫХ строки кода, каждая строка вызывает одну ОПЕРАЦИЮ над объектами вашей программы
постарайтесь теперь эти 4 строки записать кодом

p.s.
m2.clear не нужно
Text заменит весь текст мемо
1
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
25.12.2022, 00:22  [ТС]
Не знаю почему, но у меня не передаётся не чего
Delphi
1
2
3
4
5
// добавить в другой
begin
 con2.InsertItemInArray(con.links, 2 , con.links[2]);
 m2.Text:= con2.AsJSON;
end;
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
26.12.2022, 09:12
выкладывайте архив проекта
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
26.12.2022, 11:24  [ТС]
JS.zip
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
26.12.2022, 11:29  [ТС]
Читал про массивы все пишут что удобно использовать TObjectList
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
26.12.2022, 13:12
да. вот только json считает что у него массив, поэтому хочет массив
нет никаких проблем использовать для работы TObjectList<TMyClass> а в момент перевода в JSON и обратно использовать подменный временный массив, из которого потом перегружать данные в List
но это для вас следующий этап, вы еще с массивами задачу не решили

по коду
1.
ну ок, вы встроили процедуру InsertIntoArray как метод объекта-контейнера
а зачем тогда параметр arr
мы и так знаем, что там должен быть массив hits

2.
Цитата Сообщение от krapotkin Посмотреть сообщение
1. создать новый item
2. скопировать в него данные из массива 1
3. вставить новый элемент в массив 2
4. удалить старый элемент из массива 1
вот ваш код
Delphi
1
2
3
4
5
6
procedure TForm1.btnCopyClick(Sender: TObject);
// копируем
begin
 con2.InsertItemInArray(con.hits , 2 , con.hits[2] );
 m2.Lines.Text:=con2.AsJSON(true);
end;
мне кажется или тут из 4 операций в наличии только одна?
в конце концов можно было вставить создание нового итема и Item.AssignFrom вставить прямо в InsertIntoArray
но где-то они должны же быть

3.
чтобы получить нормальный читаемый вид в мемо надо 1) сделать окно на весь экран 2) вызывать AsJson(true)

4.
вот зачем вы беретесь отлаживать программу на массиве 100 элементов???
нельзя было скачать это, оставить парочку, и тренироваться??

5. самое важное
а теперь все-таки давайте посмотрим что реально происходит
Delphi
1
  con2 := TMyContainer.FromJson('{"links":[]}');
при этом у вас TMyContainer даже не содержит никакого массива links
по сути, вы просто ничего не загрузили, можно было обойтись простым
Delphi
1
con2 := TMyContainer.Create;
теперь идем к строчке
Delphi
1
con2.InsertItemInArray(con.hits , 2 , con.hits[2] );
процедура загружает в массив (1 параметр) итем (3 параметр) на позицию (2 параметр)
т.е. вы просто con.hits[2] скопировали в con.hits на позицию 2
con2 никто даже и не трогал, тем более он пустой, как мы видели выше.

опять же как выше написано, если уж мы сделали метод, то пусть он работает с массивом hits
и новый итем пусть сам создает тоже
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TMyContainer.InsertItemInHits(Index: integer;
  Item: THitsItem);
var
  i : integer;
  newItem : THitsItem;
begin
  if (index < 0) or (index > length(hits)) then
    exit;
// увеличили размер массива на единичку
  SetLength(hits, length(hits) + 1);
// раздвинули массив в нужном месте
  for i := index to length(hits) - 2 do
    hits[i+1] := hits[i];
 
  newItem := THitsItem.Create;
  newItem.AssignFrom(item);
  hits[index] := Newitem;
end;
Добавлено через 1 минуту
соответственно,
Delphi
1
con2.InsertItemInHits(2 , con.hits[2] );
но вставить на индекс 2 оно все равно не сможет, потому что там 0 элементов сейчас
1
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
26.12.2022, 14:23  [ТС]
Спасибо мне в индекс 2 и не надо мне просто чтоб в конец списка добавлялся
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
29.01.2023, 14:08  [ТС]
Не знаю можно сюда ещё писать или новую тему нужно было создавать?
Подскажите как узнать существует объект по пути или нет.

Delphi
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
var
  MJsVs: string;
  Obj: ISuperObject;
  Arr: ISuperArray;
  item: ISuperObject;
  i: Integer;
  ssaw: TStringList;
begin
 // mmo1.Clear;
 
  ssaw := TStringList.Create;
  MJsVs := TMV.MloadStr(url);
  Obj := SO(MJsVs);      // сюда загоняем json
  Arr := Obj.A['libraries'];
  mmo1.Clear;
 
  for i := 0 to Arr.Length - 1 do
  begin
   item := Arr.o[i].O['downloads'].O['artifact'];
 
   if Arr.o[i].O['downloads'].O['artifact'] <> nil  then
   begin
    mmo1.Lines.Add(IntToStr(i) + '  ' + item.S['path']);
   end
   else
   begin
    mmo1.Lines.Add(IntToStr(i) + '  ' + 'не равно');
   end;
  end;
Мне нужно узнать if Arr.o[i].O['downloads'].O['artifact'] есть ли O['artifact'] или не ?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
29.01.2023, 14:50
если не ошибаюсь, там есть метод Contains(key)
0
0 / 0 / 0
Регистрация: 08.05.2021
Сообщений: 68
29.01.2023, 15:38  [ТС]
Да есть метод
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
  for i := 0 to Arr.Length - 1 do
  begin
   item := Arr.o[i].O['downloads'];
    if item.Contains('artifact')  then
   begin
    item := Arr.o[i].O['downloads'].O['artifact'];
    mmo1.Lines.Add(IntToStr(i) + '  ' + item.  S['path']);
   end
   else
   begin
    mmo1.Lines.Add(IntToStr(i) + '  ' + 'не равно');
   end;
  end;
работает ! Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.01.2023, 15:38

Как правильно работать с JSON?
Здравствуйте! Подскажите, как правильно обрабатывать JSON в PHP, чтобы избежать монструозных конструкций такого вида: $userName=...

Как работать с JSON API?
Мне нужно получить список всех профессиональных областей отсюда : http://api.hh.ru/1/json/#proffields Я для этого использую такой код: ...

Как работать с таким json массивом?
Обычно это не представляет сложности $obj = json_decode($data); $my_var=$obj-&gt;{&quot;some_parametr_1&quot;}-&gt;{&quot;parametr_inside&quot;}; ...

Как работать с json если много ответов?
Например выдало ( json который ниже ), мне нужно узнать у них обоих именна не каждую разгадывать отдельно, а за раз, например выведет 1000...

Как записать полученные данные из json в переменную и работать с ними?
Привет! Подскажите как получить данные в переменную. Есть json фаил { &quot;arr&quot;: }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru