Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 282
Добрый день!

Подскажите, будьте добры? Мне нужно "вставлять" один JSON как значение в другом JSON.
Выполняется, результат верный, но при выполнении .Destroy одного из JSONObject вываливается invalid pointer operation.
А если убрать строчку с Destroy, то ReportMemoryLeaksOnShutdown репортит о небольших утечках.
+
var
  AJSON, AJSONFIAS: TJSONObject;
...
          try
                AJSON := TJSONObject.ParseJSONValue(S1) as TJSONObject;
                AJSONFIAS := TJSONObject.ParseJSONValue(S2) as TJSONObject;

                ((AJSON.Pairs[1].JsonValue as TJSONArray).Items[0] as TJSONObject).AddPair(TJSONPair.Create('FIASOBJ', (AJSONFIAS.Get(1).JsonValue as TJSONArray).Get(0)));
                Result := AJSON.ToString;

          finally
            AJSON.Destroy;
//            AJSONFIAS.Destroy; //вываливается если вернуть
          end;
            

Подскажите, что не так?
5 дек 18, 14:22    [21754390]     Ответить | Цитировать Сообщить модератору
 Re: Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
Dimonka
Member

Откуда:
Сообщений: 1125
Devillio,

Destroy - это конечно стандартное название деструктора, но принято всё таки для уничтожения вызывать метод Free
5 дек 18, 14:37    [21754426]     Ответить | Цитировать Сообщить модератору
 Re: Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 282
Dimonka, тот же результат
5 дек 18, 14:46    [21754437]     Ответить | Цитировать Сообщить модератору
 Re: Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 282
Разбил на 2 строки:
//                AJSONPair := TJSONPair.Create('FIASOBJ', 'TESTTEST'); //вот так все работает без утечек и invalod'ов
                AJSONPair := TJSONPair.Create('FIASOBJ', (AJSONFIAS.Pairs[1].JsonValue as TJSONArray).Items[0]); //значит так делать нельзя
                ((AJSON.Pairs[1].JsonValue as TJSONArray).Items[0] as TJSONObject).AddPair(AJSONPair);

Так как подгрузить в Value другой JSON? :(

Например, есть такой: {red:180, green:180, blue:180}
И есть такой: { result: "1", data: [ {id: "1", name: "test"} ] }
мне надо так: { result: "1", data: [ {id: "1", name: "test", fiasobj: {red:180, green:180, blue:180}} ] }
Как такое сделать? :)
5 дек 18, 15:09    [21754482]     Ответить | Цитировать Сообщить модератору
 Re: Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
Devillio
Member

Откуда: Волгоград
Сообщений: 282
Может кому-то понадобится..
Чтобы сделать копию jsonvalue, надо пользовать метод Clone;
                AJSONPair := TJSONPair.Create('FIASOBJ', (AJSONFIAS.Pairs[1].JsonValue as TJSONArray).Items[0].Clone as TJSONValue);
                ((AJSON.Pairs[1].JsonValue as TJSONArray).Items[0] as TJSONObject).AddPair(AJSONPair);

Никаких утечек, Destroy и Free без invalid
:)
5 дек 18, 15:30    [21754522]     Ответить | Цитировать Сообщить модератору
 Re: Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 637
у стандартного JSON синтаксис просто ужасен
попробуйте XSuperObject
5 дек 18, 21:17    [21755008]     Ответить | Цитировать Сообщить модератору
 Re: Почему при уничтожении TJSONObject получаю invalid pointer operation?  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9657
Это делается короче в 10.3
AJSON.GetValue<TJSONObject>['<name>[0]'].AddPair('FIASOBJ', AJSONFIAS.P['<name>[0]'].Clone)
5 дек 18, 23:59    [21755152]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить