Topic: Обработка JSON - ответов

Добрый день!

Очень интересует вопрос получения и обработки json-сообщений отправляемых серверами при почтовых и смс-рассылках. Конкретно, как их можно сохранять в базе данных и в последующем обрабатывать?

2 (edited by iacovlogica 2018-03-31 17:39:15)

Re: Обработка JSON - ответов

JSON  Оооочень простой текстовый формат по написанию я бы сказал родственник XML
Например общение с  http://narodmon.ru  происходит так :
Получение списка датчиков :

Посылаем
http://narodmon.ru/api?{"cmd":"sensorsOnDevice","id":хххх,"uuid":"065177ca671801525b642d90c0хххххх","api_key":"UNbpY7zhgххх","lang":"ru"}
Получаем
{"id":хххх,"mac":"ESP8266хххххххх","name":"ххххххххх","my":1,"owner":"10ххх","location":"Краснодарский край, Россия","distance":565.28,"liked":1,"uptime":50,"sensors":[{"id":20689,"mac":"DS18T1","fav":0,"pub":0,"type":1,"name":"Корридор","value":12.9,"unit":"°","time":1522513380,"changed":1522512796,"trend":0},{"id":25685,"mac":"U4","fav":1,"pub":0,"type":13,"name":"PZEM-004T_Напр. на
вводе","value":158.8,"unit":"V","time":1522513096,"changed":1522513096,"trend":0},
{"id":25687,"mac":"W4","fav":1,"pub":0,"type":6,"name":"PZEM-004T_Потреб. мощность","value":146,"unit":"W","time":1522513096,"changed":1522513096,"trend":0}]}

А разбирается это дело тоже очень просто
Вот процедура и функция которая выводят это в грид через временную таблицу (так надо было) :

procedure sensorsOnDevice (Sender: string; var Cancel: boolean); 

var
str:string;
kursor:integer ;
json :string ;
begin
 //{"cmd":"sensorsOnDevice","id":1234,"uuid":"UUID","api_key":"API_KEY","lang":"ru"}
json := '{"cmd":"sensorsOnDevice","id":'+id_u+',"uuid":"'+uuid+'","api_key":"'+api_key+'","lang":"'+lang+'"}'; // JSON
http_string := HTTPGet('http://narodmon.ru/api?'+json);
http_string := DecodeUTF(http_string);
log.Memo1.Lines.add('-----------------sensorsOnDevice------------------');
log.Memo1.Lines.add('http://narodmon.ru/api?'+json);
log.Memo1.Lines.add(http_string);
narod.Edit2.Text := CutData('id');
narod.Edit3.Text := CutData('owner');

//CREATE TEMPORARY TABLE VTab
//(
//id INTEGER PRIMARY KEY ,
//s_id INTEGER,
//s_name TEXT,
//s_value TEXT,
//s_unit TEXT,
//s_time INTEGER,
//)
SQLExecute ('DELETE FROM Vtab');// Очищаем временную таблицу

kursor := posex('[',http_string,1);                            
while posex('{',http_string,kursor)<>0 do                   
    begin
     kursor := posex('{',http_string,kursor);                  
     str := str +#39+ CutData('id',kursor)   +#39+ ',';
     str := str +#39+ CutData('name',kursor) +#39+ ',';
     str := str +#39+ CutData('value',kursor)+#39+ ',';
     str := str +#39+ CutData('unit',kursor) +#39+ ',';
     str := str +#39+ DateTimeToStr(UnixToDateTime(StrToInt(CutData('time',kursor))))+#39;
     SQLExecute ('INSERT INTO Vtab (s_id, s_name, s_value, s_unit, s_time ) VALUES ('+str+')' );
     str:='';
     kursor := kursor + 1;
    end;


narod.TableGrid1.dbSQL := 'SELECT id, s_id as '+#39+'ID_Датчика'+#39+', s_name AS '+#39+'Наименование'+#39+', s_value AS '+#39+'Значение'+#39+', s_unit AS '+#39+'Ед.Изм'+#39+', s_time AS '+#39+'Время '+#39+'FROM Vtab';
narod.TableGrid1.dbSQLExecute();
narod.TableGrid1.BestFitColumns(bfBoth);



//- sensors[id] целочисленный код датчика в проекте;
//- sensors[pub] = 1, если датчик публичный и = 0, если датчик приватный;
//- sensors[type] код типа датчика из справочника sensorType;
//- sensors[name] название датчика или его ID (если нет названия);
//- sensors[value] последнее показание датчика;
//- sensors[unit] единица измерения;
//- sensors[time] время последнего показания датчика в UnixTime;
//- sensors[changed] время последнего изменения показаний датчика в UnixTime;
//- sensors[trend]  коэффициент линейного роста показаний датчика за последний час, рассчитанный по МНК.
end;

function CutData(pole:string ;kursor : integer = 1 ):string ;
var
 pozN,pozK,dlin : int ;
begin
dlin := length(pole);
pozN := posex(pole,http_string,kursor) + dlin + 2 ;
if copy(http_string,pozN,1)='"' then
    begin
       pozN:=pozN + 1;
       pozK:=posex('"',http_string,pozN);
    end
else pozK := posex(',',http_string,pozN);
result := copy(http_string,pozN,pozK-pozN);
end;

Re: Обработка JSON - ответов

В Вашем случае нужно знать формат общения с почтовым сервером , по поводу смс хз ни разу не интересовался
а сохранять так же как и во временную таблицу предварительно разобрав текст на поля

Re: Обработка JSON - ответов

Спасибо за внятный ответ, буду пробовать