DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: melqui
今日帖子: 23
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/7/18 15:42:07
标题:
Qjson  Insert为什么要污染源数据? 浏览:1398
加入我的收藏
楼主:
这样移除不是违背了设计原则? 

示例
// 
testjson := TQJson.Create;
//testjson.add
//testjson.add
//testjson.add

// sourceJson 记录着部分testjson的itemindex值. 
for item in sourceJson do begin .
    // 当第二次进入到这儿时, 由于testjson被删除了一节, 
    // 导致 testjson.item[xq.AsInteger] 不存在报错.. 
    Fjson.Insert(0, testjson.item[xq.AsInteger]);
end;


这个问题怎么解决? 

procedure TQJson.Insert(AIndex: Integer; AChild: TQJson);
begin
  // 判断有父级. 
  if Assigned(AChild.Parent) then
  begin
    if AChild.Parent <> Self then  // 如果父级不是自身
      AChild.Parent.Remove(AChild)  // 将移除子json. 
    else
      Exit;
  end;
  ArrayNeeded(jdtObject);
  AChild.FParent := Self;
  AChild.FIgnoreCase := FIgnoreCase;
  if AIndex <= 0 then
    AIndex := 0
  else if AIndex >= Count then
    AIndex := Count;
  FItems.Insert(AIndex, AChild);
end;
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/7/18 16:22:04
1楼:    ajson := TQJson.Create;
   ajson.Add('1','1');
   ajson.Add('2','2');
   ajson.Add('3','3');
   ajson.Add('4','4');

   bjson := TQJson.Create;
   for itemq in ajson do begin
      // bjson.Add(itemq);  // Err
       bjson.Insert(0,itemq);
   end;

// 让人想不到的bjson结果为:
{
  "3":3,
  "1":1
}
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/7/19 14:02:47
2楼: 求解...
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 bigboy2050 (bigboy2050) ★☆☆☆☆ -
普通会员
2019/7/19 16:20:19
3楼: 用superobject 路过。。。
----------------------------------------------
kittyapp
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/7/19 16:56:36
4楼: 首先,星二,你的标题又调皮了,你是微信软文看多了?!
其次,你要明白,你的itemq 是个对象引用。。为了避免循环引用,在接到新的结点时,必须删除原引用,而你每次for时,原来的ajson的count已经变了,所以变成了bjson只有2个,你还会发现ajson也还剩2个。。。正确的做法是复制一个itemq,建立一个结点,就可以避免你所谓的污染了!。
1、按你的insert,是这样的:
  // I:=0;
  // for itemq in ajson do
  // begin
  // a := itemq.Clone;
  // a.Name := itemq.Name;
  // bjson.Insert(I, a);
  // I:=I+1;
  // end;
2、更简单的(由权威人士提供):
for itemq in ajson do
   bjson.add(itemq.name).assign(itemq);
----------------------------------------------
-
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/7/19 20:20:00
5楼: for I:=0 to ajson.count-1 do
   bjson.add( ajson.item[I] ); 

// 这样也报错啊。 
// ajson.item[I] 也是对象引用??
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/7/19 20:23:24
6楼: 那这样的话, Add, Insert毫元设计理念。 

避免循环引用不应该由代码本身解决?  而要无限Clone ??
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 tuesdays (Tuesday) ▲▲▲▲△ -
普通会员
2019/7/19 20:29:40
7楼: @crystalmoon 

参考java, C#, php代码json.  json数据插入, 加入从来都是新对象, 没人去循环引用。。 特别是json这样父子结构, 至今没听说想把引用add进源对象中。。 

我觉得qjson是不是想多了? 应该默认Clone

就是本身子json往本身节点插入, 也应该直接Clone, 

至于源节点删除与否, 应该由用户决定。
----------------------------------------------
delphi界写python最强, python界写delphi最强. 写自己的代码, 让别人去运行.
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/7/21 10:32:05
8楼: 该说的我都说了,这个概念在很多编程语言里都存在,引用类型也是要克隆的,不然,就是同一份地址,原来的对象释放后,后面的应用的对象就会报错了。你理解不了就不应该玩编程了。。。Python都还有 copy,deepcopy..。。你没听说是你的问题。
----------------------------------------------
-
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2019/7/21 10:39:23
9楼: 我的理解是,java,C#,有内存自动回收机制,如果源对象没主动删除子节点,看上去bjson是可以对的。。。但是其实是用的同一个子节点对象。。。也是有潜在问题的。比如,ajson改了,也会影响 bjson....是个很不好的编程习惯。。正规的,也应该调用它的克隆
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS