Delphi JSON parser

Mio attuale codice:

procedure TForm1.Button10Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
  IdSSL: TIdSSLIOHandlerSocketOpenSSL;
  JSON: string;
  jsonObiekt: TJSONObject;
  streams: TJSONValue;
  liczbaStrumieni: integer;
  i: integer;
begin
  IdHTTP := TIdHTTP.Create;
  try
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
    IdHTTP.IOHandler := IdSSL;
    IdHTTP.Request.CustomHeaders.AddValue('Accept', 'application/vnd.twitchtv.v3+json');
    IdHTTP.Request.CustomHeaders.AddValue('Client-ID', 'smb61nyd0vxmqdn9d3k735qbx41cdyg');
    JSON := IdHTTP.Get('https://api.twitch.tv/kraken/streams?game=StarCraft:%20Brood%20War');
  finally
    IdHTTP.Free;
  end;
  jsonObiekt := nil;
  try
    jsonObiekt := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(JSON), 0) as TJSONObject;
    streams := jsonObiekt.Get('streams').JsonValue;
    liczbaStrumieni := TJSONArray(streams).Size;
    for i := 0 to liczbaStrumieni - 1 do
    begin
      Memo6.Lines.Add(TJSONObject(TJSONArray(streams).Get(i)).Get('viewers').JsonValue.Value);
    end;
  finally
    jsonObiekt.Free;
  end;
end;

Con questo codice riesco a convincere gli spettatori per ogni voci “correnti”
Delphi JSON parser

Il mio obiettivo è quello di ottenere lo “status” da “canale”, ma questo è troppo difficile per me. Cercato di imparare da questo Come analizzare nidificati oggetto JSON in Delphi XE2?, ma nessun risultato, ancora non capisco bene. Grazie per l’aiuto.

InformationsquelleAutor mca64 | 2014-08-06



One Reply
  1. 9

    Aiuta a rompere l’oggetto in loro variabili, non cercare di fare tutto in una singola istruzione. Prova questo:

    procedure TForm1.Button10Click(Sender: TObject);
    var
      IdHTTP: TIdHTTP;
      IdSSL: TIdSSLIOHandlerSocketOpenSSL;
      JSON: string;
      jsonObiekt: TJSONObject;
      streams: TJSONArray;
      stream: TJSONObject;
      channel: TJSONObject;
      status: TJSONString;
      liczbaStrumieni: integer;
      i: integer;
    begin
      IdHTTP := TIdHTTP.Create;
      try
        IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
        IdHTTP.IOHandler := IdSSL;
        IdHTTP.Request.Accept := 'application/vnd.twitchtv.v3+json';
        IdHTTP.Request.CustomHeaders.AddValue('Client-ID', 'smb61nyd0vxmqdn9d3k735qbx41cdyg');
        JSON := IdHTTP.Get('https://api.twitch.tv/kraken/streams?game=StarCraft:%20Brood%20War');
      finally
        IdHTTP.Free;
      end;
      jsonObiekt := TJSONObject.ParseJSONValue(JSON) as TJSONObject;
      try
        streams := jsonObiekt.Get('streams').JsonValue as TJSONArray;
        liczbaStrumieni := streams.Size;
        for i := 0 to liczbaStrumieni - 1 do
        begin
          stream := streams.Get(i) as TJSONObject;
          channel := stream.Get('channel').JsonValue as TJSONObject;
          status := channel.Get('status').JsonValue as TJSONString;
          Memo6.Lines.Add(status.Value);
        end;
      finally
        jsonObiekt.Free;
      end;
    end;

    In alternativa, scaricare il JSON come byte in modo TIdHTTP non li decodifica in UTF-16, e così TJSONObject in grado di analizzare i byte originali così come sono:

    procedure TForm1.Button10Click(Sender: TObject);
    var
      IdHTTP: TIdHTTP;
      IdSSL: TIdSSLIOHandlerSocketOpenSSL;
      JSON: TBytesStream;
      jsonObiekt: TJSONObject;
      streams: TJSONArray;
      stream: TJSONObject;
      channel: TJSONObject;
      status: TJSONString;
      liczbaStrumieni: integer;
      i: integer;
    begin
      jsonObiekt := nil;
      try
        JSON := TBytesStream.Create;
        try
          IdHTTP := TIdHTTP.Create;
          try
            IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
            IdHTTP.IOHandler := IdSSL;
            IdHTTP.Request.Accept := 'application/vnd.twitchtv.v3+json';
            IdHTTP.Request.CustomHeaders.AddValue('Client-ID', 'smb61nyd0vxmqdn9d3k735qbx41cdyg');
            IdHTTP.Get('https://api.twitch.tv/kraken/streams?game=StarCraft:%20Brood%20War', JSON);
          finally
            IdHTTP.Free;
          end;
          jsonObiekt := TJSONObject.ParseJSONValue(JSON.Bytes, 0, JSON.Size) as TJSONObject;
        finally
          JSON.Free;
        end;
        streams := jsonObiekt.Get('streams').JsonValue as TJSONArray;
        liczbaStrumieni := streams.Size;
        for i := 0 to liczbaStrumieni - 1 do
        begin
          stream := streams.Get(i) as TJSONObject;
          channel := stream.Get('channel').JsonValue as TJSONObject;
          status := channel.Get('status').JsonValue as TJSONString;
          Memo6.Lines.Add(status.Value);
       end;
      finally
        jsonObiekt.Free;
      end;
    end;
    • ora è tutto chiaro. Grazie.
    • TBytesStream, manca una “s”
    • corretto, grazie

Lascia un commento