Невозможно проанализировать JSON с помощью Delphi

#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. Потрясающе … это отлично сработало.. Спасибо!