You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:TIdHTTP返回的JSON无法解码(附相关代码)

解决TIdHTTP返回JSON无法解码的问题

我来帮你搞定这个JSON解码的坑!先拆解下你代码里的问题,再给你靠谱的修正方案:

问题根源

你的代码手动处理内存流和字节数组来转换字符串,不仅步骤冗余,还容易因为编码处理不当导致JSON乱码,最终触发解码失败:

  1. 强制用TEncoding.UTF8.GetString()转换字节,但如果服务器返回的响应编码不是UTF-8(虽然这个接口大概率是,但代码不够健壮),硬转就会出现乱码。
  2. 手动读取流到字节数组的逻辑虽然没错,但完全没必要——TIdHTTP本身就提供了更可靠的字符串获取方式。

修正后的代码

直接用TIdHTTP的Get字符串重载方法,它会自动根据响应头里的Content-Type指定的编码转换字符串,省去手动处理流的麻烦:

var 
  IdHTTP1: TIdHTTP;
  s1: string;
begin
  IdHTTP1 := TIdHTTP.Create(nil);
  try
    // 直接获取字符串,自动处理响应编码
    s1 := IdHTTP1.Get('https://restcountries.eu/rest/v2/all');
    
    // 可选:保存到文件验证内容
    TFile.WriteAllText('C:\Temp\response.txt', s1, TEncoding.UTF8);
    
    // 这里可以正常解析JSON了,比如用Delphi内置JSON库
    // 示例:
    // var JSONValue: TJSONValue;
    // JSONValue := TJSONObject.ParseJSONValue(s1);
    // try
    //   // 处理JSON内容
    // finally
    //   JSONValue.Free;
    // end;
  finally
    IdHTTP1.Free;
  end;
end;

额外注意事项

  • 确保你的Delphi版本是Delphi 2009及以上(支持UnicodeString),否则字符串处理会有兼容性问题。
  • 如果还是遇到解码异常,可以检查IdHTTP1.Response.ContentEncoding属性,确认响应的实际编码类型后再针对性调整。

内容的提问来源于stack exchange,提问作者Alfred767

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:15:20