【问题标题】:Destroying json array in delphi在delphi中销毁json数组
【发布时间】:2021-12-03 06:37:07
【问题描述】:
下面的代码会造成内存泄漏。
正确的方法是什么?
JSONArray := TJSONArray.Create;
try
JSONArray :=
TJSONObject.ParseJSONValue(
TEncoding.UTF8.GetBytes(
'[{"username":"admin"},{"username":"developer"}]'
), 0
) as TJSONArray;
finally
JSONArray.Free;
end;
【问题讨论】:
标签:
arrays
json
delphi
destroy
【解决方案1】:
问题是对TJSONArray.Create 的调用。您正在创建自己的 TJSONArray 对象,然后覆盖 JSONArray 指针以指向完全不同的 TJSONArray 对象,从而泄漏您 Create'd 的原始对象。
所以,只需摆脱 Create 电话,您就不需要它了。你只需要FreeParseJSONValue()返回的对象。
此外,您不需要将 JSON 字符串转换为字节。 ParseJSONValue() 有一个接受 string 作为输入的重载。
试试这个:
JSONArray := TJSONObject.ParseJSONValue(
'[{"username":"admin"},{"username":"developer"}]'
) as TJSONArray;
try
// ...
finally
JSONArray.Free;
end;
【解决方案2】:
作为提供的有效解决方案的替代方案,但使用mORMot。恕我直言,更简单、更清洁并避免内存泄漏:
program Project1;
{$APPTYPE CONSOLE}
uses
Syncommons;
var Json : TDocVariantData;
begin
Json.InitJSon('[{"username":"admin"},{"username":"developer"}]');
// Testing
assert(Json.Kind = dvArray);
assert(Json.Count = 2);
assert(TDocVariantData(Json.Values[1]).U['username'] = 'developer');
end.
请找到更多详细信息和替代方案in the amazing documentation。