#json #delphi #delphi-10.3-rio
#json #delphi #delphi-10.3-rio
Вопрос:
У меня есть строка JSON, которая поступает из Amazon. (https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json ) Верхняя часть JSON выглядит следующим образом…
Мне нужно получить список ТОЛЬКО значений OfferCode и versionIndexUrl. Я могу прочитать массив предложений, но ключ каждого предложения отличается, поэтому я не могу использовать ИМЯ (comprehend, AmazonMWAA и т. Д.). Я пытался использовать элемент [0], но я получаю AV. Вот мой соответствующий код…
procedure Load_AWS_Services;
var
json: string;
idx: Integer;
obj: TJSONObject;
j_array: TJSONArray; // the array of all lineitems/offers
lineItem : TJSONObject;
ServiceEntry: TJSONPair;
begin
try
JSON := DownloadFromURLasString('https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json');
obj := TJSONObject.ParseJSONValue(JSON) as TJSONObject;
try
// Now parse the data...
j_array := TJSONArray(obj.Get('offers').JsonValue);
// Now loop through each individual item
for idx := 0 to pred(j_array.size) do
begin
lineItem := TJSONObject(j_array.Get(idx));
Main.Memo1.Lines.Add(lineItem.ToString); // this shows each offer...so good to this point
ServiceEntry := lineItem.Pairs[0];
ShowMessage(ServiceEntry.Value); // AV here
Что мне нужно изменить в последних 2 строках, чтобы прочитать ВНУТРИ «предложений»?
Комментарии:
1. «Невозможно проанализировать JSON с помощью Delphi» — это полностью ложное утверждение. Очевидно, что вы можете проанализировать JSON, полученный от AWS.
2. @PeterWolf — Если я не могу получить элемент, который я пытаюсь получить, то я не могу правильно проанализировать…
3. Вы не можете правильно получить доступ к значениям в проанализированном JSON. Ответ указывает, почему.
4. Пожалуйста, не размещайте изображения для представления текстовых данных. Изображения нельзя скопировать и вставить для использования в поиске решения, они нечитаемы с мобильных устройств и недружелюбны для программ чтения с экрана. Отправьте текст как текст и правильно отформатируйте его для отображения.
Ответ №1:
offers
Поле является объектом JSON, а не массивом JSON (если бы вы использовали as
оператор для TJSONArray
приведения, вы бы получили EInvalidCast
исключение).
Попробуйте это вместо:
procedure Load_AWS_Services;
var
json: string;
idx: Integer;
j_val: TJSONValue;
j_obj: TJSONObject;
j_pair: TJSONPair;
offers: TJSONObject;
lineItem : TJSONObject;
begin
try
json := DownloadFromURLasString('https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/index.json');
j_val := TJSONObject.ParseJSONValue(json);
try
j_obj := j_val as TJSONObject;
// Now parse the data...
offers := j_obj.GetValue('offers') as TJSONObject;
// Now loop through each individual item
for idx := 0 to pred(offers.Count) do
begin
j_pair := offers.Get(idx);
Main.Memo1.Lines.Add(j_pair.JsonString.Value);
lineItem := j_pair.JsonValue as TJSONObject;
ShowMessage(lineItem.GetValue('offerCode').Value);
ShowMessage(lineItem.GetValue('versionIndexUrl').Value);
...
end;
finally
j_val.Free;
end;
except
...
end;
end;
Комментарии:
1. Потрясающе … это отлично сработало.. Спасибо!