DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jsuguo
今日帖子: 33
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2017/10/18 19:52:49
标题:
请教大神,TJSONObject内存泄露的问题 浏览:1130
加入我的收藏
楼主: type
  TItem=record
  p4p:string;
  end;

function TForm1.获取商品(str: string): TItemArr;
var
  MyJson:TJSONObject;
  Arr:TJSONArray;
  I:Integer;
  jsonvalue: Tjsonvalue;
begin
  try
    MyJson:=TJSONObject.ParseJSONValue(Trim(str)) as TJSONObject;
    if MyJson.Count=4 then
    begin
      MyJson:=TJSONObject.ParseJSONValue(Trim(MyJson.Values['mods'].ToString)) as TJSONObject;
      MyJson:=TJSONObject.ParseJSONValue(Trim(MyJson.Values['itemlist'].ToString)) as TJSONObject;
      MyJson:=TJSONObject.ParseJSONValue(Trim(MyJson.Values['data'].ToString)) as TJSONObject;
      Arr:=MyJson.GetValue('auctions') as TJSONArray;
      SetLength(Result,Arr.Count);
      for I:=0 to Arr.Count - 1 do
      begin
        if (Arr.Get(I) as TJSONObject).TryGetValue('p4p',jsonvalue) then Result[I].p4p:=(Arr.Get(I) as TJSONObject).GetValue('p4p').Value;
      end;
    end;
  finally
    MyJson.Free;
  end;
end;


调用这个函数:
var
  MyItemArr:TItemArr;
  商品字符串:string;

for I:=0 to 10 do
begin
  商品字符串:=获取商品字符串(I);   //这里获取到的是一个json
  MyItemArr:=获取商品(商品字符串);
  //这里是写入数据库的代码
  SetLength(MyItemArr,0);
end;

这个获取商品的函数不知道为什么会造成内存泄露,TJSONObject我已经释放了,TJSONArray和Tjsonvalue网上说不用释放,我试过了也没法free,请大神帮我看看为什么会内存泄露。
----------------------------------------------
作者:
男 redhan (晓寒) ★☆☆☆☆ -
盒子活跃会员
2017/10/18 22:00:25
1楼: try
    MyJson:=TJSONObject.ParseJSONValue(Trim(str)) as TJSONObject;
    if MyJson.Count=4 then
    begin
      MyJson:=TJSONObject.ParseJSONValue(Trim(MyJson.Values['mods'].ToString)) as TJSONObject;
      MyJson:=TJSONObject.ParseJSONValue(Trim(MyJson.Values['itemlist'].ToString)) as TJSONObject;
      MyJson:=TJSONObject.ParseJSONValue(Trim(MyJson.Values['data'].ToString)) as TJSONObject;
      Arr:=MyJson.GetValue('auctions') as TJSONArray;
      SetLength(Result,Arr.Count);
      for I:=0 to Arr.Count - 1 do
      begin
        if (Arr.Get(I) as TJSONObject).TryGetValue('p4p',jsonvalue) then Result[I].p4p:=(Arr.Get(I) as TJSONObject).GetValue('p4p').Value;
      end;
    end;
  finally
    MyJson.Free;
  end;
不内存泄露才怪
TJSONObject.ParseJSONValue 每次都是返回一个新的json对象,你只释放了一个
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2017/10/18 22:25:11
2楼: 谢谢楼上,我用了4个TJSONObject解决了内存泄露的问题,但是这个办法太笨了,请问有没有简单的办法来读多层json中的值呢?
----------------------------------------------
作者:
男 kuei (kuei) ★☆☆☆☆ -
盒子活跃会员
2017/10/19 8:16:24
3楼: 把值先取出来,在释放物件,不就好了
为什么Code一定要写在同一行呢?

      try
        str := Trim(MyJson.Values['mods'].ToString);
      finally
        MyJson.Free;
      end;
      MyJson := TJSONObject.ParseJSONValue(str) as TJSONObject;
      try
        str := Trim(MyJson.Values['itemlist'].ToString);
      finally
        MyJson.Free;
      end;
      MyJson := TJSONObject.ParseJSONValue(str) as TJSONObject;
      try
        str := Trim(MyJson.Values['data'].ToString);
      finally
        MyJson.Free;
      end;
      MyJson := TJSONObject.ParseJSONValue(str) as TJSONObject;
----------------------------------------------
-
作者:
男 liminx (liminx) ★☆☆☆☆ -
普通会员
2017/10/19 10:46:38
4楼: 不错不错。
----------------------------------------------
-
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2017/10/19 14:43:07
5楼: 我竟然没释放过
----------------------------------------------
-
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2017/10/19 21:23:25
6楼: 我才不信TJSONObject不提供检索查询子节点的方法了

一定要用ParseJSONValue创建解析来得到下级或子节点
----------------------------------------------
-
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2017/10/19 21:24:07
7楼: 如果是这样,那说明TJSONObject选择有问题,不然就是LZ这写码思路有问题
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2017/10/20 10:01:18
8楼: 代码思路有问题。TJSONObject 解析JSON还是很方便的,就是写功能弱一些。
把JSON贴出来,给你优化下代码。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2017/10/20 10:34:16
9楼: 我来写个范例:
const
  JSON = '{ "o": { ' +
    '    "1234567890": {' +
    '    "last use date": "2010-10-17T01:23:20",' +
    '    "create date": "2010-10-17T01:23:20",' +
    '    "name": "iPhone 8s"' +
    '        }' +
    '  },' +
    '  "Index": 0, ' +
    '  "Data": {"Index2": 1}, ' +
    '  "a": [{' +
    '    "last use date": "2010-10-17T01:23:20",' +
    '    "create date": "2010-11-17T01:23:20",' +
    '    "name": "iPhone 8s",' +
    '    "arr": [1,2,3] ' +
    '  }, ' +
    '  {' +
    '    "message": "hello"' +
    '  }]' +
    '}';

var
  JsonObject: TJSONObject;
begin
  JsonObject := TJSONObject.ParseJSONValue(JSON) as TJSONObject;
  try
    if JsonObject <> nil then
    begin
      ShowMessage(DateTimeToStr(JsonObject.GetValue<TDateTime>('o.1234567890.last use date'))); // 2010-10-17 1:23:20
      ShowMessage(JsonObject.GetValue<string>('Data.Index2')); // 1
      ShowMessage(JsonObject.GetValue<string>('a[0].name')); // iPhone 8s

      ShowMessage(JsonObject.GetValue<string>('a[0].arr[2]')); // 3
      ShowMessage(JsonObject.GetValue<string>('a[1].message')); // hello
    end;
  finally
    FreeAndNil(JsonObject);
  end;
end;
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS