3

我尝试通过 RadServer IIS 包和 Delphi 客户端与 EMSEndpoint 交换数据。我尝试的东西对我来说看起来很简单,但我现在无法完成。

在包中有一个指向 MSSql 服务器的 TFDConnection。TFDQuery 与该 Connection 相连。使用此代码,我创建 JSON 响应(服务器端):

var lStream: TStringStream := TStringStream.create;

    FDQuery.SaveToStream(lStream,sfJSON);
    AResponse.Body.SetStream(lStream,'application/json' ,True);

使用该代码,我尝试将数据集加载到 TFDMemtable(客户端)中:

 lstrstream: TStringStream := TStringStream.create(EMSBackendEndpoint.Response.Content);
 aMemtable.LoadFromStream(lstrstream, sfJSON);

Memtable 说这[FireDac][Stan]-719 invalid JSON storage format 怎么可能?我知道问题出在哪里,我的流中有 äöü 符号,但是当我将它从一个组件加载到另一个组件时,它应该可以工作,不是吗?有什么建议我可以尝试吗?到目前为止我已经尝试过:

  • 通过 UTF8toUnicode 在客户端加载 JSON。这让我加载了 Memtable,但导致缺少像 öäü 这样的字母
  • 将服务器端的 UTF8toUnicode 和客户端的 backwords 更改为 UTF8toUnicode。这导致 Memtable 的 JSON 不可读
  • 在加载到 Memtable 之前,将 JSON 加载到 JSONString 并在本地格式化。这导致 JSON 不可读,因为数组和对象字符也被引用了。
4

1 回答 1

2

JSON 最常使用 UTF-8 进行交换,但默认情况下在 WindowsTStringStream 上不使用 UTF-8,仅在 Posix 系统上使用。尝试使用TStringStream.Create(..., TEncoding.UTF8)强制 UTF-8。

这假设FDQuery.SaveToStream()使用 UTF-8 保存,并aMemtable.LoadFromStream()使用 UTF-8 加载,否则您仍然会遇到编码不匹配。

于 2021-10-18T16:22:10.470 回答