Вложенные объекты JSON - PullRequest
       9

Вложенные объекты JSON

0 голосов
/ 11 января 2019

Я использую API для вывода файла JSON как такового, и поэтому не могу редактировать формат файла JSON. Есть ли какой-нибудь способ иметь возможность перебирать каждую внутридневную дату, чтобы найти значение open в каждой дате?

Я пытался использовать Object.intraday[0].open, однако, похоже, это не работает, так как он не содержится в массиве? Я понимаю, что могу использовать Object.intraday.date.open (где дата, например, "2018-10-19 15:59:00:"); однако я хочу иметь возможность индексировать в разное время.

{
    "symbol": "AAPL",
    "stock_exchange_short": "NASDAQ",
    "timezone_name": "America/New_York",
    "intraday": {
        "2018-10-19 15:59:00:" {
            "open": "219.49",
            "close": "219.23",
            "high": "219.61",
            "low": "219.19",
            "volume": "302415"
        },
        "2018-10-19 15:58:00:" {
            "open": "219.62",
            "close": "219.48",
            "high": "219.70",
            "low": "219.48",
            "volume": "173762"
        },
             ....

Это Паскаль-код, который я использую для этого, используя тестовый JSON {"intraday":{"2018-10-1915:59:00":{"open":"23","low":"4"},"2018-10-1915:58:00":{"open":"25","low":"21"}}}

  JSONValue := TJSONObject.ParseJSONValue('{"intraday":{"2018-10-1915:59:00":{"open":"23","low":"4"},"2018-10-1915:58:00":{"open":"25","low":"21"}}}');
  j:=0;
  begin
    if JSONVAlue is TJSONObject then
      begin
          // Get the quote and low values
          quote := JSONValue.GetValue<string>('intraday[0]');
          low := JSONValue.GetValue<string>('intraday.low');
          Memo1.Lines.Add(quote + ': ' + low);
          j := j+1;
      end;
   end;

1 Ответ

0 голосов
/ 11 января 2019
procedure TfmMain.ParseIntraDay(AMemo: TMemo);
var
  LObject, LIntraDayObj: TJSONObject;
  LEnumerator: TJsonPairEnumerator;
  LQuote, LLow: String;
begin
  LObject := TJSONObject.ParseJSONValue('{"intraday":{"2018-10-19 15:59:00":{"open":"23","low":"4"},"2018-10-19 15:58:00":{"open":"25","low":"21"}}}') as TJSONObject;
  try
    LIntraDayObj := LObject.GetValue('intraday') as TJSONObject; //{"2018-10-19 15:59:00":{"open":"23","low":"4"},"2018-10-19 15:58:00":{"open":"25","low":"21"}}
    LEnumerator := LIntraDayObj.GetEnumerator;
    while LEnumerator.MoveNext do
    begin
      LQuote := LEnumerator.Current.JsonString.Value;
      LLow := (LEnumerator.Current.JsonValue As TJsonObject).Values['low'].Value;
      AMemo.Lines.Add(String.Format('%s: %s', [LQuote, LLow]));
    end;
   finally
     LObject.Free;
   end;
end;

В записке должно быть указано следующее:

2018-10-19 15:59:00: 4
2018-10-19 15:58:00: 21

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

...