正在销毁 delphi 中的 json 数组

Destroying json array in delphi

下面的代码造成内存泄漏。 正确的方法是什么?

  JSONArray := TJSONArray.Create;
  try
    JSONArray :=
      TJSONObject.ParseJSONValue(
        TEncoding.UTF8.GetBytes(
          '[{"username":"admin"},{"username":"developer"}]'
        ), 0
      ) as TJSONArray;
  finally
    JSONArray.Free;
  end;

问题是对 TJSONArray.Create 的调用。您正在创建自己的 TJSONArray 对象,然后覆盖 JSONArray 指针以指向完全不同的 TJSONArray 对象,泄漏您 Create 的原始对象。

所以,简单地去掉那个 Create 调用,你不需要它。您只需要 Free ParseJSONValue() returns.

的对象

此外,您不需要将 JSON 字符串转换为字节。 ParseJSONValue() 有一个接受 string 作为输入的重载。

试试这个:

JSONArray := TJSONObject.ParseJSONValue(
  '[{"username":"admin"},{"username":"developer"}]'
) as TJSONArray;
try
  // ...
finally
  JSONArray.Free;
end;

作为提供的有效解决方案的替代方案,但使用 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