Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2015, 16:27   #1
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию JSON проверить существование значения

Добрый день! такая проблема! По сети приходят разные сообщения в формате JSON

допустим вот такое приходится при подключении

Код:
{
    "id": "GUID клиента",
    "version": "версия ПО клиента" 
}
и допустим сообщения о пинге, овталился или нет!

Код:
{
    "ping": 0
}
Обрабатываю так

Код:
procedure TSetCacheThreadTCP.DoRecv;
var
  Xml: TXml;
  jsObject: TJSONObject;
  iPingValue: integer;
  sValue: string;
  // itemxml: TXmlItem;
begin
{$IFDEF JSON}
  jsObject := TJSONObject.ParseJSONValue(FBufferRecv) as TJSONObject;
{$ELSE}
  Xml := TXml.Create;
{$ENDIF}
  try
{$IFDEF JSON}
     iPingValue := StrToInt(jsObject.GetValue('ping').Value);
   // iPingValue := StrToInt(jsObject.Values['ping'].Value);
    if iPingValue = 0 then
      Self.Send := GetNetMessagePong;
{$ELSE}
    Xml.DataXML := FBufferRecv;
{$ENDIF}
    //
{$IFDEF DEBUG}
    LogRecv(FBufferRecv);
    if Assigned(MainForm) then
      MainForm.BegubMemoRecv.Lines.Add(FBufferRecv);
{$ENDIF}
    // if Xml.Root.Attribut('id') <> '' then
    // begin
    // закидываем данные в хранилище
    while not TransportCacheList.Blocked do
    begin
      // If not TransportCacheList.Blocked then
      // begin
      TransportCacheList.Block;
{$IFDEF JSON}
      JSONToReadValuesList(jsObject);
{$ELSE}
      XmlToReadValuesList(Xml);
{$ENDIF}
      // TransportCacheList.UnBlock;
      // end
      // else
      // Sleep(Random(200));
    end;
    TransportCacheList.UnBlock;
    // проверить на наличие тега ошибки и запустить процедуру ошибки или же нет?
    // end;

  finally
    FreeAndNil(Xml);
  end;
  // а тепер ьвызываем срабатывание события в родители
  inherited;
end;

Код:
   iPingValue := StrToInt(jsObject.GetValue('ping').Value);
Тут вываливаеться с ошибкой, потмоу что приходит первое сообщение где нет ключа ping? как проверить наличие данного ключа?
Dozent вне форума Ответить с цитированием
Старый 07.04.2015, 17:03   #2
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

что такое ссылочный тип и что такое value тип понимаете?
lomastr_ вне форума Ответить с цитированием
Старый 07.04.2015, 18:16   #3
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

проблему решил

Код:
    jsValue := jsObject.GetValue('ping');
    // if Assigned(jsObject.GetValue('ping')) then
    if Assigned(jsValue) then
    begin
      // iPingValue := StrToInt(jsValue.Value);
      if StrToInt(jsValue.Value) = 0 then
        Self.Send := GetNetMessagePong;
    end;
Dozent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить существование значения в TStringList Shouldercannon Общие вопросы Delphi 4 20.01.2013 15:03
Проверить существование файла на сервере Wicort JavaScript, Ajax 8 04.05.2012 23:16
Проверить существование папки Stepan575 Visual C++ 4 17.12.2010 19:02
Проверить существование поля в JavaScript Wicort JavaScript, Ajax 2 06.10.2009 18:13