У мене сервер відпочинку, який повертає наступну рядок 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.
Великий урок тут - зупинити використання неперевірених типів кастингу. Використання подібних ролей викликає неприємності. Коли ваші дані не відповідають вашому коду, ви отримуєте непотрібні повідомлення про помилки.