Правильная очистка памяти при работе с JSON

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Правильная очистка памяти при работе с JSON

Сообщение GAMER » 13.11.2020 14:32:51

Код: Выделить всё
uses
  fpjson, jsonparser;

procedure JSONTest;
var
  jData : TJSONData;
  jObject : TJSONObject;
  jArray : TJSONArray;
  s : String;
begin
 
  // this is only a minimal sampling of what can be done with this API

  // create from string
  jData := GetJSON('{"Fld1" : "Hello", "Fld2" : 42, "Colors" : ["Red", "Green", "Blue"]}');

  // output as a flat string
  s := jData.AsJSON;

  // output as nicely formatted JSON
  s := jData.FormatJSON;

  // cast as TJSONObject to make access easier
  jObject := TJSONObject(jData);

  // retrieve value of Fld1
  s := jObject.Get('Fld1');

  // change value of Fld2
  jObject.Integers['Fld2'] := 123;

  // retrieve the second color
  s := jData.FindPath('Colors[1]').AsString;

  // add a new element
  jObject.Add('Happy', True);

  // add a new sub-array
  jArray := TJSONArray.Create;
  jArray.Add('North');
  jArray.Add('South');
  jArray.Add('East');
  jArray.Add('West');
  jObject.Add('Directions', jArray);

end;

Пример взят с https://wiki.freepascal.org/fcl-json
Как правильно очистить
jData : TJSONData;
jObject : TJSONObject;
jArray : TJSONArray;
?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Правильная очистка памяти при работе с JSON

Сообщение iskander » 13.11.2020 16:06:07

TJSONData это же просто класс, верно?
Стало быть достаточно со всей строгостью ему сказать: "Free"!

UPD: в данном примере
Код: Выделить всё
jObject.Free;
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Правильная очистка памяти при работе с JSON

Сообщение GAMER » 13.11.2020 16:32:15

jData , jArray указывают куда-то. Оставлять?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Правильная очистка памяти при работе с JSON

Сообщение iskander » 13.11.2020 16:47:37

jObject в своих потрохах прячет хеш-таблицу, и когда вы делаете
Код: Выделить всё
jObject.Add('Directions', jArray);

он помещает jArray в эту таблицу и впоследствии освобождает сам. А jData в данном примере указывает на jObject.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Правильная очистка памяти при работе с JSON

Сообщение sts » 13.11.2020 18:21:49

одно только jData := GetJSON(... намекает (возвращает экземпляр класса который создает внутри) что пользоваться этой либой не стоит.
автор либы не в курсе базовых правил, типа кто создал тот и освобождает, удивлен что такое вообще еще существует
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Правильная очистка памяти при работе с JSON

Сообщение iskander » 13.11.2020 18:27:16

Автор либы(этой и множества других) - Michael Van Canneyt. Все претензии к нему. :)
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Правильная очистка памяти при работе с JSON

Сообщение sts » 13.11.2020 18:45:07

такие либы лучше на самоуничтожающихся интерфейсых объектах делать, задача и так не быстрая и дополнительный оверхед интерфейсов погоду не сделают, помнится пользовался SUPERObjects или както так
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Правильная очистка памяти при работе с JSON

Сообщение iskander » 13.11.2020 19:06:48

sts писал(а):такие либы лучше на самоуничтожающихся интерфейсых объектах делать,

Могу только подсказать, как достучаться до Михаэля: заходите на багтрекер FPC(или лучше на Free Pascal mailing list) и расскажите всё это там.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Правильная очистка памяти при работе с JSON

Сообщение sts » 13.11.2020 19:12:28

судя по тому что в исходниках я не нашел GetJSON, ему это быстро объяснили
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Правильная очистка памяти при работе с JSON

Сообщение iskander » 13.11.2020 19:16:37

sts писал(а):судя по тому что в исходниках я не нашел GetJSON

Модуль FpJson, строка 794. :)
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Правильная очистка памяти при работе с JSON

Сообщение sts » 13.11.2020 19:21:55

у меня чет нету lazarusfpc2.2.4sourcepackagesfcl-jsonsrcfpjson.pp
Код: Выделить всё
793 constructor TJSONFloatNumber.Create(AValue: TJSONFloat);
794 begin
795  FValue:=AValue;
796 end;


Добавлено спустя 4 минуты 17 секунд:
хаха, действительно в 3.0.2 есть, это еще и свежак
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Правильная очистка памяти при работе с JSON

Сообщение iskander » 13.11.2020 19:29:30

sts писал(а):lazarusfpc2.2.4

ОМГ.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Правильная очистка памяти при работе с JSON

Сообщение sts » 13.11.2020 19:30:03

это конечно жопа

Добавлено спустя 4 минуты 35 секунд:
там парсер сам объекты создает
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Правильная очистка памяти при работе с JSON

Сообщение GAMER » 13.11.2020 19:47:23

А потом хоть чистит? Или он только jObject : TJSONObject; создает?
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Правильная очистка памяти при работе с JSON

Сообщение sts » 13.11.2020 20:03:24

да чистит

Добавлено спустя 1 минуту 15 секунд:
а самый первый надо самому удалять
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru