我有一个用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参数时。
谢谢!
答案 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}]