/ / Як розібрати відповідь рядка json за допомогою Delphi - json, delphi, розбору, delphi-xe

Як проаналізувати відповідь рядка json за допомогою Delphi - json, delphi, parsing, delphi-xe

У мене сервер відпочинку, який повертає наступну рядок json:

response:="{"result":["[{"email":"XXX@gmail.com","regid":"12312312312312312313213w"},{"email":"YYYY@gmail.com","regid":"AAAAAAA"}]"]}";

Я хотів би проаналізувати відповідь, щоб отримати список усіх email і regid предмети

Я спробував наступний код, але я отримую AV на (TJSONPair(LItem).JsonString.Value="email")

Будь-яка допомога буде оцінена.

Заздалегідь дякую, Луїз

var
LResult:TJSONArray;
LJsonresponse:TJSONObject;
i:integer;
LItem,jv:TJsonValue;
email,regid:string;

LJsonresponse:=TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(response),0) as TJSONObject;
LResult:=(LJsonresponse.GetValue("result") as TJSONArray);
jv:=TJSONArray(LResult.Get(0));
for LItem in TJSONArray(jv) do begin
if (TJSONPair(LItem).JsonString.Value="email") then begin
email:=TJSONPair(LItem).JsonValue.Value;
end;
if (TJSONPair(LItem).JsonString.Value="regid") then begin
regid:=TJSONPair(LItem).JsonValue.Value;
end;
end;

Відповіді:

11 за відповідь № 1

Ваші проблеми починаються тут:

jv := TJSONArray(LResult.Get(0));

Проблема полягає в тому, що LResult.Get(0) не повертає примірник TJSONArray. Фактично він повертає екземпляр TJSONString. Цей рядок має значення:

"[{"email":"XXX@gmail.com","regid":"12312312312312312313213w"},{"email":"YYYY@gmail.com","regid":"AAAAAAA"}]"

Схоже, вам потрібно буде розібратися в цьомурядок як JSON, щоб витягти те, що вам потрібно. Ось якийсь загальний код, який це робить. Вибачте, будь ласка, її якість, тому що я не маю досвіду роботи з парсером Delphi JSON.

{$APPTYPE CONSOLE}

uses
SysUtils, JSON;

const
response =
"{"result":["[{"email":"XXX@gmail.com","regid":"12312312312312312313213w"},"+
"{"email":"YYYY@gmail.com","regid":"AAAAAAA"}]"]}";

procedure Main;
var
LResult: TJSONArray;
LJsonResponse: TJSONObject;
ja: TJSONArray;
jv: TJSONValue;
begin
LJsonResponse := TJSONObject.ParseJSONValue(response) as TJSONObject;
LResult := LJsonResponse.GetValue("result") as TJSONArray;
ja := TJSONObject.ParseJSONValue(LResult.Items[0].Value) as TJSONArray;
for jv in ja do begin
Writeln(jv.GetValue<string>("email"));
Writeln(jv.GetValue<string>("regid"));
end;
end;

begin
try
Main;
except
on E: Exception do
Writeln(E.ClassName, ": ", E.Message);
end;
Readln;
end.

Великий урок тут - зупинити використання неперевірених типів кастингу. Використання подібних ролей викликає неприємності. Коли ваші дані не відповідають вашому коду, ви отримуєте непотрібні повідомлення про помилки.