powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить на nil?
7 сообщений из 7, страница 1 из 1
Как проверить на nil?
    #39567290
forklive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, Всем!
Работаю с TLkJson для парсинга JSON строк.

Хочу научиться проверять существование конкретного поля.
Смысл в том что JSON объекты приходят иногда с разным количеством полей.
Пример 1:
Код: php
1.
[{"site":12,"title":"Заголовок", "addField":"15"}]


Пример 2:
Код: php
1.
[{"site":12,"title":"Заголовок"}]



Как видите - в примере 2 отсутствует поле "addField".
И проблема в том что когда я обращаюсь к результату после парсинга такой строки (без поля "addField")

Код: pascal
1.
jsonEvent.Field['addField'].Value



...то получаю ошибку "AccessViolation".

Если писать

Код: pascal
1.
if Assigned(jsonEvent.Field['addField'].Value) ... 


то ругается компилятор на несовместимость типов данных.

Начинаю копаться в отладчике.
После обращения к полю мы попадаем в процедуру
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TlkJSONobject.GetField(AName: Variant):TlkJSONbase;
begin
  if VarIsStr(AName) then
    //попадаем вот сюда
    result := OldGetField(VarToWideStr(AName))
  else
    result := inherited GetField(AName);
end;



затем вот сюда
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function TlkJSONobject.OldGetField(nm: WideString): TlkJSONbase;
var
  mth: TlkJSONobjectmethod;
  i: Integer;
begin
  i := IndexOfName(nm);
  if i = -1 then
    begin
      //когда поля не существует - возвращает nil
      result := nil;
    end
  else
    begin
//      mth := TlkJSONobjectmethod(FValue[i]);
      mth := TlkJSONobjectmethod(fList.Items[i]);
      result := mth.FValue;
    end;
end;



Видим что когда поля не существует исходники TLkJSON в своих глубинах возвращают nil.
Но if Assigned(..) при этом не работает.

Как быть? Что нужно написать, чтобы не получать этот AccessViolation?

Спасибо.
...
Рейтинг: 0 / 0
Как проверить на nil?
    #39567295
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
if Assigned(jsonEvent.Field['addField']) ...

???
...
Рейтинг: 0 / 0
Как проверить на nil?
    #39567301
forklive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Код: pascal
1.
if Assigned(jsonEvent.Field['addField']) ...

???


да-да, ужасно.
Но я ж говорю - копался в исходниках - увидел что где то возвращается nil, и решил проверить на nil Assigned.
...
Рейтинг: 0 / 0
Как проверить на nil?
    #39567305
forklive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде разобрался как правильно работать с TLkJSON:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm1.Button2Click(Sender: TObject);
var
  jsonStr : string;
  i : Integer;
  jsonListEvent : TlkJSONList;
  jsonEvent: TlkJSONObject;
begin
  jsonStr := '[{"siteId":"12","title":"Title","addField":"valueOfAddField"}]';
  jsonListEvent := TlkJSON.ParseText(jsonStr) as TlkJSONlist;
  for i := 0 to jsonListEvent.count  - 1 do
  begin

    jsonEvent := TLkJsonObject(jsonListEvent.Child[i]);
    ShowMessage(jsonEvent.getString('AddField11'))

  end;
end;



При таком раскладе, если поля нет - возвращается пустая строка, или 0 в зависимости от того что вызывать - getInt или getString
...
Рейтинг: 0 / 0
Как проверить на nil?
    #39567337
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
forklive_Vasilisk_
Код: pascal
1.
if Assigned(jsonEvent.Field['addField']) ...


???да-да, ужасно.Я спрашиваю, такая проверка как у меня в коде работает?
...
Рейтинг: 0 / 0
Как проверить на nil?
    #39567387
forklive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_forkliveпропущено...
да-да, ужасно.Я спрашиваю, такая проверка как у меня в коде работает?

Нет. Компилятор ругается на несовместимость типов.
...
Рейтинг: 0 / 0
Как проверить на nil?
    #39567682
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
forkliveНет. Компилятор ругается на несовместимость типов.Каких типов? Спрашиваю третий раз. Не
forklive
Код: pascal
1.
if Assigned(jsonEvent.Field['addField'].Value) ... 

а_Vasilisk_
Код: pascal
1.
if Assigned(jsonEvent.Field['addField']) ...

Вы разницу видите?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как проверить на nil?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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