当我尝试解组格式不正确的 JSON 对象时,我希望来自 UnMarshall 函数的对象引用,但它为零。但是,当我关闭我的应用程序时,该对象会产生内存泄漏。
TMyObject = class
private
FName: String;
end;
AJSON := TJSONObject.ParseJSONValue('{ type: "MyObject.TMyObject", id: 1, fields: { FName: "David", FAge: 20 } }');
//FAge attribute don't exists in TMyObject, so it raises an exception when unmarshalling
with TJSONUnMarshal.Create() do
begin
try
Result := Unmarshal( AJSON );
//First chance exception at $77322F71. Exception class EConversionError with message 'Internal: Field FAge cannot be found in type TMyObject'. Process MyApp.exe (3056)
finally
Free();
end;
//Here the result is nil, but internally the object was created and is alive
end
function TJSONUnMarshal.Unmarshal(Data: TJSONValue): TObject;
var
Root: TJSONObject;
begin
if not (Data is TJSONObject) then
raise EConversionError.Create(SCannotCreateObject);
// clear previous warnings
ClearWarnings;
Root := TJSONObject(Data);
try
Result := CreateObject(Root)
finally
FObjectHash.Clear;
end;
end;
如果 JSON 对象不是预期的格式,它会引发异常,但不会破坏对象创建的引用,也不会在函数中返回它。
因此,使用我的服务器的人可以调用一些函数,并且没有任何保证发送到请求中的 JSON 格式正确。
我该如何处理这种情况?有一种方法可以使用相应的类验证 JSON 对象吗?
ps:我用的是Delphi XE7