В данной статье мы рассмотрим пример разбора JSON данных, представленных в формате, указанном в исходном вопросе, с использованием встроенного JSON-фреймворка Delphi. Задача состоит в извлечении данных из массива MAILCONFIGS, содержащего пары ключ-значение, где ключ – адрес электронной почты, а значение – объект с данными конфигурации почты (client_id, apptoken, temptoken).
Решение с использованием встроенного JSON-фреймворка Delphi:
Пользователь JIMSMITH, используя предоставленный Remy Lebeau код, смог решить задачу. Приведем этот код с небольшими пояснениями и улучшениями. Предполагается, что вы используете Delphi 10.1 Update 2 или более позднюю версию, так как в ней уже присутствует встроенный JSON-фреймворк.
uses
System.JSON, System.SysUtils;
procedure ProcessMailConfigs(const JsonString: string);
var
JsonObj: TJSONObject;
MailConfigsArray: TJSONArray;
MailConfigObj: TJSONObject;
Email: string;
ConfigObj: TJSONObject;
ClientID, AppToken, TempToken: string;
begin
try
JsonObj := TJSONObject.ParseJSONValue(JsonString) as TJSONObject;
try
MailConfigsArray := JsonObj.GetValue('MAILCONFIGS') as TJSONArray;
for var element in MailConfigsArray do
begin
// Каждый элемент массива - это TJSONObject, содержащий пару email:config
MailConfigObj := element as TJSONObject;
// Получаем email из ключа объекта
for var pair in MailConfigObj.GetKeys do
begin
if VarIsObject(pair) and (pair as TJSONObject).ClassName = 'TJSONObject' then
begin
Email := pair;
ConfigObj := (pair as TJSONObject);
break;
end;
end;
// Извлекаем данные конфигурации
ClientID := ConfigObj.GetValue('client_id').Value;
AppToken := ConfigObj.GetValue('apptoken').Value;
TempToken := ConfigObj.GetValue('temptoken').Value;
// Выводим данные (или используем их по необходимости)
Writeln('Email: ' + Email);
Writeln('Client ID: ' + ClientID);
Writeln('App Token: ' + AppToken);
Writeln('Temp Token: ' + TempToken);
Writeln('---');
end;
finally
JsonObj.Free;
end;
except
on E: Exception do
Writeln('Ошибка при разборе JSON: ' + E.Message);
end;
end;
// Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
var
JsonString: string;
begin
JsonString := '{ "SPWORKDATA":
{ "DB_PARAMS":
{ "Pooled":"False",
"DriverID":"Oracle",
"Database":"iranums",
"User_name":"rms",
"Password":"trojan",
"Server":"lilly.com",
"Port":"5432",
"Monitorby":"",
"MetaDefSchema":"False" },
"MAILCONFIGS": [
{"mail1@gmail.com": { "client_id": "ClientID_Data1", "apptoken": "apptoken data1", "temptoken": "temporary token1" } },
{"mail2@gmail.com": { "client_id": "client_data2", "apptoken": "apptoken data2", "temptoken": "temporary token2" } } ],
"MEDIASERVER": { "Server": "192.162.2.185" }, "MSGSERVER": { "Server": "127.0.0.1", "Port":"55555" } } }';
ProcessMailConfigs(JsonString);
end;
Пояснения к коду:
uses System.JSON, System.SysUtils;: Подключение необходимых модулей для работы с JSON и общими функциями.
ProcessMailConfigs(const JsonString: string): Процедура, принимающая JSON строку в качестве параметра.
TJSONObject.ParseJSONValue(JsonString) as TJSONObject: Разбор JSON строки в объект TJSONObject.
JsonObj.GetValue('MAILCONFIGS') as TJSONArray: Получение массива MAILCONFIGS из объекта.
Цикл for var element in MailConfigsArray do: Итерация по элементам массива MAILCONFIGS. Каждый элемент представляет собой TJSONObject, содержащий пару "email:config".
Вложенный цикл for var pair in MailConfigObj.GetKeys do: Перебор ключей в объекте MailConfigObj для получения адреса электронной почты.
ConfigObj := (pair as TJSONObject);: Получение объекта конфигурации.
ConfigObj.GetValue('client_id').Value; и аналогичные строки: Извлечение значений client_id, apptoken и temptoken из объекта конфигурации.
Writeln(...): Вывод извлеченных данных в консоль. В реальном приложении эти данные будут использоваться для дальнейшей обработки.
try...finally...except: Обработка исключений и освобождение ресурсов.
Альтернативное решение: использование библиотеки SuperObject:
Если вы работаете с более старыми версиями Delphi, в которых отсутствует встроенный JSON-фреймворк, или хотите более удобный и быстрый способ работы с JSON, можно использовать стороннюю библиотеку, например, SuperObject. SuperObject предоставляет более гибкий и удобный API для работы с JSON, а также хорошую производительность.
Пример использования SuperObject (требует установки библиотеки):
uses
SuperObject, SysUtils;
procedure ProcessMailConfigsSuperObject(const JsonString: string);
var
JsonValue: TSuperObject;
MailConfigsArray: TSuperObject;
MailConfigObj: TSuperObject;
Email: string;
ConfigObj: TSuperObject;
ClientID, AppToken, TempToken: string;
begin
JsonValue := TSuperObject.ParseJSONValue(JsonString);
try
MailConfigsArray := JsonValue.Get('MAILCONFIGS') as TSuperObject;
for MailConfigObj in MailConfigsArray do
begin
for Email in MailConfigObj.Keys do
begin
ConfigObj := MailConfigObj.Get(Email) as TSuperObject;
ClientID := ConfigObj.Get('client_id').AsString;
AppToken := ConfigObj.Get('apptoken').AsString;
TempToken := ConfigObj.Get('temptoken').AsString;
Writeln('Email: ' + Email);
Writeln('Client ID: ' + ClientID);
Writeln('App Token: ' + AppToken);
Writeln('Temp Token: ' + TempToken);
Writeln('---');
end;
end;
finally
JsonValue.Free;
end;
end;
Заключение:
В данной статье мы рассмотрели два способа разбора JSON массива MAILCONFIGS в Delphi и Pascal: с использованием встроенного JSON-фреймворка и сторонней библиотеки SuperObject. Выбор конкретного способа зависит от версии Delphi, которую вы используете, и ваших предпочтений в отношении удобства и производительности. Оба решения позволяют эффективно извлекать и использовать данные о настройках почты, содержащиеся в JSON.
Статья о разборе JSON данных с использованием встроенного JSON-фреймворка Delphi и библиотеки SuperObject.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.