procedure TForm1.btn4Click(Sender: TObject); const FieldName: array[1..3] of string = ('姓名','單位','地址'); FielValue: array[1..3] of string = ('張三','華爲','廣州'); var blockCount, FieldCount, i, j: Integer; Doc, DocBlock, DocField: TDocVariantData; v1, Data: variant; begin Doc.Init; Doc.I['blockCount'] := 3; for i := 1 to 3 do begin DocBlock.Init; DocBlock.I['FieldCount'] := i; for j := 1 to i do begin DocField.Init; V1 := _Json(WideStringToUTF8(Format('{"Name":"%s","Value":["%s","%s","%s"]}', [ FieldName[j], FielValue[j] + '_1', FielValue[j] + '_2', FielValue[j] + '_3' ] ))); DocBlock.A_['fields']^.AddItem(v1); TDocVariantData(Data).InitJSON(DocBlock.ToJSON()); end; doc.A_['blocks']^.AddItem(Data); end; mmo1.Lines.Text := UTF8ToWideString(doc.ToJSON); end; {"blockCount":3,"blocks":[ {"FieldCount":1,"fields":[{"Name":"姓名","Value":["張三_1","張三_2","張三_3"]}]}, {"FieldCount":2,"fields":[{"Name":"姓名","Value":["張三_1","張三_2","張三_3"]},{"Name":"單位","Value":["華爲_1","華爲_2","華爲_3"]}]}, {"FieldCount":3,"fields":[{"Name":"姓名","Value":["張三_1","張三_2","張三_3"]},{"Name":"單位","Value":["華爲_1","華爲_2","華爲_3"]},{"Name":"地址","Value":["廣州_1","廣州_2","廣州_3"]}]} ]}
uses SynCommons;ide
前面的寫法有內存泄漏,下面是修改好的代碼:code
procedure TForm1.btn4Click(Sender: TObject); const FieldName: array[1..3] of string = ('UserName','Department','Address'); FielValue: array[1..3] of string = ('Gets','Google','American'); var i, j: Integer; Doc, DocBlock: TDocVariantData; v1, Data: variant; begin Doc.Init; Doc.I['blockCount'] := 3; for i := 1 to 3 do begin DocBlock.Init; DocBlock.I['FieldCount'] := i; for j := 1 to i do begin V1 := _Json(WideStringToUTF8(Format('{"Name":"%s","Value":["%s","%s","%s"]}', [ FieldName[j], FielValue[j] + '_1', FielValue[j] + '_2', FielValue[j] + '_3' ] ))); DocBlock.A_['fields']^.AddItem(v1); VarClear(v1); end; TDocVariantData(Data).InitJSON(DocBlock.ToJSON()); doc.A_['blocks']^.AddItem(Data); DocBlock.Clear; FreeAndNil(DocBlock); VarClear(Data); end; mmo1.Lines.Text := UTF8ToWideString(doc.ToJSON); doc.Clear; FreeAndNil(doc); end;