Декодировать json с помощью uJson для delphi

У меня есть файл JSON, который выглядит так, и я пытаюсь его декодировать, но безуспешно:

[
  {
    "FirstName": "Kim",
    "Surname": "Jensen"
  },
  {
    "FirstName": "Amery",
    "Surname": "Mcmillan"
  },
  {
    "FirstName": "Denton",
    "Surname": "Burnett"
  }
  ...
]

Используя uJson с Delphi 2007, я знаю, как извлечь данные, когда массив имеет такое имя:

{
  "Names": [
    {
      "FirstName": "Kim",
      "Surname": "Jensen"
    },
    {
      "FirstName": "Amery",
      "Surname": "Mcmillan"
    },
    {
      "FirstName": "Denton",
      "Surname": "Burnett"
    }
    ...
  ]
}
var
  json: TJSONObject;
  Text: String;
  i: Integer;
begin
  json := TJSONObject.create(jsontext);

  for i:=0 to json.getJSONArray('Names').Length -1 do
  begin
    Text := json.getJSONArray('Names').getJSONObject(i).optString('FirstName');
    ...
  end;
end;

Но у этого массива нет имени, и я перепробовал почти все, что мог придумать, и все же эта простая вещь заняла у меня несколько часов, чтобы понять.


person Kim HJ    schedule 19.06.2019    source источник
comment
Возможный дубликат массива или массива JSON для синтаксического анализа Delphi   -  person Sam M    schedule 19.06.2019


Ответы (1)


В JSON, с которым у вас возникли проблемы, данные верхнего уровня являются массивом, поэтому вам нужно проанализировать его, используя TJSONArray вместо TJSONObject.

var
  json: TJSONArray;
  Text: String;
  i: Integer;
begin
  json := TJSONArray.create(jsontext);
  try
    for i := 0 to json.Length-1 do
    begin
      Text := json.getJSONObject(i).optString('FirstName');
      ...
    end;
  finally
    json.Free;
  end;
end;
person Remy Lebeau    schedule 19.06.2019
comment
По какой-то причине я всегда думал, что мне нужно сначала добавить его к объекту, прежде чем я смогу получить к нему доступ. Спасибо, Реми. - person Kim HJ; 19.06.2019