如何用delphi正确释放JSON对象

2026-01-16 22:16:53 2014德国世界杯

我用的是德尔菲里约。

我需要创建一个JSON。我的代码创建了JSON,但是当我释放JSON对象时,我会得到一个AV。

在我的代码中,我注意到AV发生在js.Free中,当我添加以下行时:

代码语言:javascript复制 jaespecs:=GetEspecsFromMedico(fieldbyname('nr').AsInteger);

jstemp.AddPair('especs',jaespecs);我的JSON有以下格式:

代码语言:javascript复制{data:[

{

data_agenda:'23/02/67',

medicos:[

{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]},

{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]}

]

},

{

data_agenda:'23/02/68',

medicos:[

{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]},

{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]}

]

}

]

}我的函数可以很好地创建json,除了用("js.Free")释放JSON时的AV。以下是代码:

代码语言:javascript复制function GetJSONPeriodo(datai,dataf: TDatetime;const med:Integer=-1;const espec:Integer=-1): string;

var i:integer;

dia:string;

js,jso,jstemp:TJSonObject;

ja,jatemp,jaespecs:TjsonArray;

vdata:TDatetime;

function GetEspecsFromMedico(med:Integer):TjsonArray;

var qry:TFDQuery;

je:TJsonObject;

begin

je:=TJsonObject.Create;

result:=TjsonArray.Create;

qry:=controller.DM.CreateQuery();

try

with qry do begin

close;

Sql.Clear;

SQl.Add('select A.nr,B.nome,A.nesp from ESP_QUE_MEDICO_TEM A');

if prepared then disconnect;

Open;

First;

while not eof do begin

je.AddPair('nome',TJsonString.create(fieldbyname('nome').AsString));

je.AddPair('nesp',TJsonString.create(fieldbyname('nesp').AsString));

result.AddElement(je);

next;

end;

end;

finally

qry.Free;

end;

end;

begin

vdata:=datai;

js:=TJSonObject.Create;

ja:=TjsonArray.Create;

try

while vdata<=dataf do begin

i:=DayOfWeek(vdata);

dia:= uppercase(formatsettings.ShortDayNames[i]);

with DM.FDQQuery do begin

Close;

SQL.Clear;

SQL.Add('Select B.nr,B.nome,A.hini,A.hfim from HORARIO_ATEND_MEDICO A');

if not prepared then prepare;

parambyname('dia').Value:=dia;

Open;

jso:=TJsonObject.Create;

jso.AddPair('data_agenda',TJSONString.Create(formatdatetime('dd/mm/yyyy',vdata)));

jatemp:=TjsonArray.Create;

while not eof do begin

jstemp:=TJsonObject.Create;

jstemp.AddPair('text',TJSONString.Create(fieldbyname('nome').AsString));

// if I get rid off the next two lines, no AV occur

jaespecs:=GetEspecsFromMedico(fieldbyname('nr').AsInteger);

jstemp.AddPair('especs',jaespecs);

jatemp.AddElement(jstemp);

next;

end;

jso.AddPair('medicos',jatemp);

ja.AddElement(jso);

end;

vdata:=vdata+1;

end;

js.AddPair('data',ja);

result:=js.ToJSON;

finally

js.Free; //I get an AV here

end;

end;

最新发表
友情链接