Witam,
Jako że z danymi JSON mam pierwszy raz styczność wykorzystałem gotowe rozwiązanie które oferuje delphi, czyli użyłem typu TJsonTextReader, jednak kod procedury odczytu danych jest bardzo długi ok 800 linijek kodu. Poniżej fragment kodu z tym rozwiązaniem. Proszę was o opinie czy takie rozwiązanie jak stosuję jest dobre? Zastanawiam się czy nie ma jakiegoś szybszego rozwiązania, aby kodu było mniej i szybszy odczyt danych.
if JSON.TokenType = TJsonToken.StartObject then
begin
JSON.read;
while not(JSON.TokenType = TJsonToken.EndObject) do
begin
if JSON.TokenType = TJsonToken.PropertyName then
begin
if JSON.Value.AsString = 'id' then
begin
JSON.read;
fArrayOfferInfoActive[R].id := JSON.Value.AsString;
end
else
if JSON.Value.AsString = 'parameters' then
begin
JSON.read; // [
while not(JSON.TokenType = TJsonToken.EndArray) do
begin
P := Length(fArrayOfferInfoActive[R].parameters);
Setlength(fArrayOfferInfoActive[R].parameters, P + 1);
JSON.read; // {
while not(JSON.TokenType = TJsonToken.EndObject) do
begin
if JSON.TokenType = TJsonToken.PropertyName then
if JSON.Value.AsString = 'id' then
begin
JSON.read;
fArrayOfferInfoActive[R].parameters[P].id := JSON.Value.AsString;
end
else
if JSON.Value.AsString = 'rangeValue' then
begin
JSON.read;
if not(JSON.TokenType = TJsonToken.Null) then
while not(JSON.TokenType = TJsonToken.EndObject) do
begin
if JSON.TokenType = TJsonToken.PropertyName then
if JSON.Value.AsString = 'from' then
begin
JSON.read;
fArrayOfferInfoActive[R].parameters[P].rangeValue.from := JSON.Value.AsString;
end
else
if JSON.Value.AsString = 'to' then
begin
JSON.read;
fArrayOfferInfoActive[R].parameters[P].rangeValue.too := JSON.Value.AsString;
end;
JSON.read;
end
else
begin
fArrayOfferInfoActive[R].parameters[P].rangeValue.from := '';
fArrayOfferInfoActive[R].parameters[P].rangeValue.too := '';
end
end
else
if JSON.Value.AsString = 'values' then
begin
Setlength(fArrayOfferInfoActive[R].parameters[P].values, V);
JSON.read; // [
while not(JSON.TokenType = TJsonToken.EndArray) do
begin
if JSON.TokenType = TJsonToken.String then
begin
V := Length(fArrayOfferInfoActive[R].parameters[P].values);
Setlength(fArrayOfferInfoActive[R].parameters[P].values, V + 1);
fArrayOfferInfoActive[R].parameters[P].values[V] := JSON.Value.AsString;
end;
JSON.read;
end
end
else
if JSON.Value.AsString = 'valuesIds' then
begin
Setlength(fArrayOfferInfoActive[R].parameters[P].valuesIds, V);
JSON.read; // [
while not(JSON.TokenType = TJsonToken.EndArray) do
begin
if JSON.TokenType = TJsonToken.String then
begin
V := Length(fArrayOfferInfoActive[R].parameters[P].valuesIds);
Setlength(fArrayOfferInfoActive[R].parameters[P].valuesIds, V + 1);
fArrayOfferInfoActive[R].parameters[P].valuesIds[V] := JSON.Value.AsString;
end;
JSON.read;
end
end;
JSON.read;
end;
JSON.read;
end;
end else
if ........ //itd
end;
JSON.Read;
end;