1

我有一个在 Delphi XE4 中构建的安静的应用程序服务器,我所有的带有复杂参数的 JSON 方法(如 JSONObject)都作为 nil 或空对象接收。我已经阅读了很多教程,但我仍然不知道为什么它不起作用。

我正在使用 Chrome 浏览器中的一个名为“Advanced rest client app”的工具测试我的应用程序服务器。

重要事实:如果我有一个用 Delphi 构建的客户端,它运行得非常好。如果我尝试使用任何客户端使用 GET 请求,它会完美运行。

相同的代码:

function TServerMethods.cancelDeleteCheque(const aJSONObject: TJSONObject): TJSONObject;
var
  DMCheques: TDMCheques;
  sException: String;
begin
  try
    try
      sException := _EMPTY;
      result := TJSONObject.Create(nil);
      DMCheques := TDMCheques.GetInstance(nil);

      with aJSONObject do
      begin
        DMCheques.AddFilter(Format(' (CDCHENUMERO = %s) AND (NUMEROBANCO = %s) ', [QuotedStr(TJSONString(Get(0).JSONValue).Value),
          QuotedStr(TJSONString(Get(1).JSONValue).Value)]));
        DMCheques.cdsprincipal.Open;
        DMCheques.cdsPrincipal.Delete;
      end;
    except
      on E: Exception do
        sException := E.Message;
    end;
  finally
    if sException <> _EMPTY then
      result.AddPair(_EXCEPTION, TJSONString.Create(sException));

    if Assigned(DMCheques) then
      FreeAndNil(DMCheques);
  end;
end;

我收到此消息错误:“Project AppServer.exe 引发异常类 $C0000005 并带有消息‘在 0x0069b470 处的访问冲突:读取地址 0x0000000c’。” 当我尝试访问 aJSONObject 参数时。

谢谢!

4

1 回答 1

0

如果您在评论中提供的示例 JSON 是准确的,那么我认为问题在于您的字符串是单引号(')。

JSON 规范规定使用双引号("),这是 Delphi XE4 JSON 解析器所期望的。很可能“工作”的环境对 JSON 规范的应用不那么严格并且接受单引号字符串,它们是有效的 JavaScript 但不是 JSON。

即对于 Delphi XE4(并且根据json.org),这不是有效的 JSON:

[{'CodigoUsuario':1,'CodigoEmpresa': 1}]

尝试解析此结果会导致 NIL 对象,因为它不代表有效的 JSON 值,这可能就是您最终将 NIL 传递给您的方法的原因。

要让 Delphi XE4 接受这一点,您必须对字符串进行双引号编码:

[{"CodigoUsuario":1,"CodigoEmpresa": 1}]
于 2013-10-30T02:46:40.767 回答