Delphi XE4, библиотека Data.DBXJSON, собственно код:
Код:
procedure TForm1.FormDblClick(Sender: TObject);
var i: Word;
jsonDB, jBuf: TJSONObject; arrBuf: TJSONArray;
buf: TStringList;
begin
arrBuf:= TJSONArray.Create;
for i:= 0 to grdParts.RowCount -1 do
begin
jBuf:= TJSONObject.Create;
jBuf.AddPair('name', grdParts.Cells[0,i]); //grdParts: TStringGrid
jBuf.AddPair('size', grdParts.Cells[1,i]);
arrBuf.AddElement(jBuf);
end;
jsonDB.Create(TJSONPair.Create('parts', arrBuf));
buf:= TStringList.Create;
buf.Text:= jsonDB.ToString;
jsonDB.Free;
buf.SaveToFile('DB_save.json');
buf.Free;
end;
Первая пара ('name') добавляется нормально, на второй ('size') вылетает "out of memory". То же самое происходит при добавлении
второго элемента в массив (в jBuf одна пара).
Самое странное что аналогичный код в пробном проекте работает нормально:
Код:
procedure TForm1.FormDblClick(Sender: TObject);
var i, j: Integer; buf: TJSONObject; arrBuf: TJSONArray; s: string;
begin
arrBuf:= TJSONArray.Create;
MyJSON:= TJSONObject.Create; //глобально
for i := 0 to StringGrid1.RowCount - 1 do
begin
buf:= TJSONObject.Create;
for j := 1 to StringGrid1.ColCount - 1 do
begin
buf.AddPair('opt'+IntToStr(j),TJSONNumber.Create(StringGrid1.Cells[j,i]));
end;
arrBuf.AddElement(TJSONObject.Create(TJSONPair.Create(StringGrid1.Cells[0,i],buf)));
end;
MyJSON.AddPair('Фигня',arrBuf);
MyList.Text:= MyJSON.ToString;
MyJSON.Free;
MyList.SaveToFile('000.json'); {}
end;
Ну т.е. понятно что хоть и аналогичный, но есть какая-то разница из-за которой и вылетает ошибка. Что не так сообразить не могу