【问题标题】:Retrieving JSON data from URL in Delphi XE7在 Delphi XE7 中从 URL 检索 JSON 数据
【发布时间】:2017-12-25 15:39:12
【问题描述】:

我正在尝试从 URL 获取 JSON 数据。我要连接的网站是:

http://www.bitven.com/assets/js/rates.js

它包含以下 JSON 字符串:

{
  "USD_TO_BSF_RATE": 112268.29,
  "BTC_TO_USD_RATE": 13870.9,
  "ETH_TO_USD_RATE": 752.222,
  "BCH_TO_USD_RATE": 2960.81,
  "LTC_TO_USD_RATE": 272.476,
  "XRP_TO_USD_RATE": 1.01954,
  "ETC_TO_USD_RATE": 31.1101,
  "DASH_TO_USD_RATE": 1178.0,
  "ZEC_TO_USD_RATE": 561.377,
  "XMR_TO_USD_RATE": 354.709
}

我需要获取我提到的站点中每 5 分钟更新一次的 USD_TO_BSF_RATE 的值。我的代码如下:

uses
  ... System.JSON, IdHTTP;

function  GetUrlContent(s: string): string;
var
  IdHTTP1: TIdHTTP;
begin
  IdHTTP1.Create;
  GetUrlContent:=IdHTTP1.Get(s);
  IdHTTP1.Destroy;
end;

procedure DolarUpdate;
var
  json: string;
  obj: TJSONObject;
  url: string;
begin
  try
    json:=GetUrlContent('http://www.bitven.com/assets/js/rates.js');
    try
      obj := TJSONObject.ParseJSONValue(json) as TJSONObject;
      TabbedForm.Edit2.Text := obj.Values['USD_TO_BSF_RATE'].Value;
    finally
      obj.Free;
    end;
  except
    on E : Exception do
    begin
      ShowMessage('Error'+sLineBreak+E.ClassName+sLineBreak +E.Message);
    end;
  end;
end;

我的应用程序无法正常运行,也没有返回任何消息。它只会崩溃。

我做错了什么?

【问题讨论】:

  • 函数崩溃时的错误信息是什么?
  • 根本没有消息
  • 我不相信你。会有访问冲突。
  • 事实上,另一个错误仍然存​​在。当我修改Edit2的内容并再次脉冲按钮时,程序崩溃了。

标签: json delphi delphi-xe7


【解决方案1】:

您的GetUrlContent() 函数编码不正确。它需要看起来像这样:

function GetUrlContent(s: string): string;
var
  IdHTTP1: TIdHTTP;
begin
  IdHTTP1 := TIdHTTP.Create;
  try
    Result := IdHTTP1.Get(s);
  finally
    IdHTTP1.Free;
  end;
end;

您的DolarUpdate() 程序应该看起来更像这样:

procedure DolarUpdate;
var
  json: string;
  obj: TJSONObject;
  url: string;
begin
  try
    json := GetUrlContent('http://www.bitven.com/assets/js/rates.js');
    obj := TJSONObject.ParseJSONValue(json) as TJSONObject;
    if obj = nil then raise Exception.Create('Error parsing JSON');
    try
      TabbedForm.Edit2.Text := obj.Values['USD_TO_BSF_RATE'].Value;
    finally
      obj.Free;
    end;
  except
    on E : Exception do
    begin
      ShowMessage('Error' + sLineBreak + E.ClassName + sLineBreak + E.Message);
    end;
  end;
end;

【讨论】:

    猜你喜欢
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多