在Delphi XE中获取并显示网站API的JSON数据

3 投票
2 回答
6496 浏览
提问于 2025-04-18 08:08

我正在尝试把我用Python写的一段代码改写成Delphi。
Python代码是:

url = "https://www.bitstamp.net/api/ticker/"
response = urllib.urlopen(url)
data = json.loads(response.read())
lastvalue = data['last']

这段代码足以把从bitstamp的API获取到的值赋给一个叫“lastvalue”的变量。

我想用Delphi做同样的事情(我使用的是Delphi XE6)。我试着在这里找一些答案,能够连接到bitstamp的网站并获取完整的字符串,方法是:

function GetURLAsString(const aurl:  string): string;
var
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    lHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
    Result := lHTTP.Get(aURL);
  finally
    lHTTP.Free;
  end;
end;

然后我用这个调用这个函数:

procedure TForm2.Button1Click(Sender: TObject);
var
mydata : string;

begin
mydata := GetURLAsString('https://www.bitstamp.net/api/ticker/');
Label1.Text := mydata;
end;

我在这里遇到了瓶颈。我搜索了很多,但还是不知道怎么把“last”赋值给Label1.Text。

当我运行这个时,我得到的是 {"high": "629.40", "last": "622.00", "timestamp": "1401544416", "bid": "621.99", "vwap": "617.47", "volume": "15147.30475739", "low": "602.26", "ask": "622.00"} 这个字符串被赋给了Label1.Text。

我希望我能把问题解释清楚。我在这个点上卡了好几天,希望有人能帮我。

2 个回答

2

使用SuperObject这个免费的开源JSON解析器,代码可以写成:

var
  Mydata: string;
  MyObject: ISuperObject;
  Last: string; 
begin
  ... // perform GET request and store response in Mydata

  MyObject := SO(Mydata);
  Last := MyObject.S['last'];

  ...

或者可以更简短地写成:

  // get the JSON web resource content 
  Mydata := GetURLAsString('...');

  // get the value of the 'last' property of the object
  Last := SO(Mydata).S['last'];
5

你可以使用 DBXJSON 这个工具来解析 JSON 格式的响应数据。

试试下面这个示例:

var
  LJsonObj   : TJSONObject;
  LJsonValue : TJSONValue;
begin
    mydata := GetURLAsString('https://www.bitstamp.net/api/ticker/');
    LJsonObj    := TJSONObject.ParseJSONValue(TEncoding.Default.GetBytes(mydata),0) as TJSONObject;
  try
     LJsonValue := LJsonObj.Get('last').JsonValue;
     Label1.Text:= LJsonValue.Value;
  finally
     LJsonObj.Free;
  end;
end;

撰写回答