2

我正在尝试使用 Delphi 7 中的 SuperObject 解析此字符串。

procedure TForm1.btn1Click(Sender: TObject);
var
 obj: ISuperObject;
 fw:string;
begin
  fw:= '{"type":"normal","info":{"Name":"frank","Number":"01","Age":"21","registered":"Yes","Support":"Expired"}}';
  obj := TSuperObject.ParseString(PWideChar(fw), false);
  mmo1.lines.Add(obj.AsJSon(true,false));
end;

但是备忘录中的结果是这样的:

“??????????????????????????????????????????????????? ???}”

我究竟做错了什么?

4

2 回答 2

3

fw 是一个字符串,在 Delphi 7 中是 8 位 ANSI 编码的。因此,转换为 PWideChar 是不正确的。它将 8 位文本视为 UTF-16 编码。

如果您调用的函数确实收到了 PWideChar,那么您需要先转换为 UTF-16。例如像这样:

PWideChar(WideString(fw))

您还报告了超级目标代码中出现的一个单独问题。特别是这行代码:

h := h*129 + ord(k[i]) + $9e370001;

引发溢出错误。

发生这种情况是因为您的项目启用了溢出检查选项(这样做的好习惯),但是超级目标代码是在假设该选项被禁用的情况下编写的。这确实是超级目标代码中的一个缺陷。您可以通过在超级目标代码中添加{$OVERFLOWCHECKS OFF}. 理想情况下,仅针对故意溢出的代码在本地禁用此功能。但是,除非您完全理解代码,否则将代码{$OVERFLOWCHECKS OFF}放在单元顶部并继续前进可能会更容易。

现在,我正在查看最新的超级目标代码,单元顶部是{$OVERFLOWCHECKS OFF}. 所以我想知道您是否使用了过时的代码版本。从 repo 中提取最新版本。

于 2013-09-20T11:51:38.863 回答
2

我在delphi 7中使用SuperObjects1.2.4时遇到了同样的问题。正如很多人所说,解决方案是:获取最新版本。因此,要从存储库获取最新的 SuperObjects 版本,请执行以下操作: 1. 安装 git ( http://git-scm.com/ ) 2. 右键单击​​某个文件夹,选择“Git bash”并粘贴以下内容

git clone https://code.google.com/r/steve-superobject/

完毕!

于 2014-03-04T04:05:41.520 回答