如何使用JSONObject作为参数发送JSON请求?

时间:2013-10-29 12:38:53

标签: json delphi

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

我正在使用Chrome浏览器中的工具测试我的应用服务器,称为“高级休息客户端应用”。

重要事实:如果我有一个用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参数时。

谢谢!

1 个答案:

答案 0 :(得分: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}]
相关问题