powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сохранение JSON объекта
13 сообщений из 13, страница 1 из 1
Сохранение JSON объекта
    #39725378
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При попытке сохранить большой JSON объект (40+ мбайт данных)
Код: pascal
1.
SL.Add(TJson.Format(JObject));


выскакивает ошибка out of memory.
Кто нибудь сталкивался, как решить?
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725382
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle940+ мбайт данных
Где, чего, когда ... Могли перед этим вызовом быть 1.5 гиг текста загружены ...
Лучше пример кода привести.
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725384
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При закрытии формы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  SL: TStringList;
  JObject: TJSONObject;
  ToolArray: TJSONArray;
  ToolObject: TJSONObject;

  DataArray: TJSONArray;
  DataObject: TJSONObject;

  i, j: integer;
begin
  SL := TStringList.Create;
  try
    JObject := TJSONObject.Create;
    if (Tools.Count > 0) then
    begin
      ToolArray := TJSONArray.Create;
      for i := 0 to Tools.Count - 1 do
      begin
        ToolObject := TJSONObject.Create;
        ToolObject.AddPair('name', TJSONString.Create(Tools[i].name));
        ToolObject.AddPair('symbol', TJSONString.Create(Tools[i].symbol));
        ToolObject.AddPair('link', TJSONString.Create(Tools[i].link));

        if (Tools[i].Data.Count > 0) then
        begin
          DataArray := TJSONArray.Create;
          for j := 0 to Tools[i].Data.Count - 1 do
          begin
            DataObject := TJSONObject.Create;
            DataObject.AddPair('date', TJSONNumber.Create(Tools[i].Data[j].Date));
            DataObject.AddPair('open', TJSONNumber.Create(Tools[i].Data[j].Open));
            DataObject.AddPair('high', TJSONNumber.Create(Tools[i].Data[j].high));
            DataObject.AddPair('low', TJSONNumber.Create(Tools[i].Data[j].low));
            DataObject.AddPair('close', TJSONNumber.Create(Tools[i].Data[j].close));
            DataArray.AddElement(DataObject);
          end;
          ToolObject.AddPair('Data', DataArray);
        end;
        ToolArray.AddElement(ToolObject);
      end;
      JObject.AddPair('Tools', ToolArray);
    end;

    SL.Add(TJson.Format(JObject));
    SL.SaveToFile(ExtractFilePath(Application.ExeName) + 'DATA.json');
  finally
    FreeAndNil(SL);
    FreeAndNil(JObject);
  end;
end;
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725386
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

а зачем ты строку, которую возвращает Format(), перед сохранением в TStringList загоняешь?
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725388
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TJsonTextWriter
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725400
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КотовасияMiracle9,

а зачем ты строку, которую возвращает Format(), перед сохранением в TStringList загоняешь?
Чтобы сохранить её в файл.
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725416
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

а по-другому - никак, только после копирования в стриглист?

Ты хоть проверь, доходит ли дело до формирования выходной строки. Может, у тебя все на Format() падает.
Почему не используешь superobject, если такой ленивый. Там и в файл, и в поток сохранение есть, и быдлокодить в два раза меньше.
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725420
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КотовасияMiracle9,

а по-другому - никак, только после копирования в стриглист?

Ты хоть проверь, доходит ли дело до формирования выходной строки. Может, у тебя все на Format() падает.
Почему не используешь superobject, если такой ленивый. Там и в файл, и в поток сохранение есть, и быдлокодить в два раза меньше.
Пробавал без Format() тоже самое.
Меня обычный JSON устраивал, всё что нужно есть.
А на счёт "быдлокодить", какие в интернете статьи такие и кодеры :)
Спасибо Дмитрию за TJsonTextWriter. Прикольная вещь. Думаю буду теперь её использовать.
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725428
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

что ты "без Format" пробовал?
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725955
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переделал я код, проблема осталась - out of memory
Если при сохранении файл получается меньше 80мб всё ок, больше ошибка

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
procedure TFMain.FormClose(Sender: TObject; var Action: TCloseAction);
var
  i, j: integer;
  StringWriter: TStringWriter;
  Writer: TJsonTextWriter;
  SW: TStreamWriter;
begin
  SW := TStreamWriter.Create(ExtractFilePath(Application.ExeName) + 'DATA.json', False, TEncoding.UTF8);
  StringWriter := TStringWriter.Create;
  Writer := TJsonTextWriter.Create(StringWriter);
  try
    Writer.Formatting := TJsonFormatting.Indented;

    Writer.WriteStartObject;
    if (Tools.Count > 0) then
    begin
      Writer.WritePropertyName('Tools');
      Writer.WriteStartArray;
      for i := 0 to Tools.Count - 1 do
      begin
        Writer.WriteStartObject;
        Writer.WritePropertyName('name');
        Writer.WriteValue(Tools[i].name);
        Writer.WritePropertyName('symbol');
        Writer.WriteValue(Tools[i].symbol);
        Writer.WritePropertyName('link');
        Writer.WriteValue(Tools[i].link);
        if (Tools[i].Data.Count > 0) then
        begin
          Writer.WritePropertyName('Data');
          Writer.WriteStartArray;
          for j := 0 to Tools[i].Data.Count - 1 do
          begin
            Writer.WriteStartObject;
            Writer.WritePropertyName('date');
            Writer.WriteValue(DateToStr(Tools[i].Data[j].Date));
            Writer.WritePropertyName('open');
            Writer.WriteValue(Tools[i].Data[j].open);
            Writer.WritePropertyName('high');
            Writer.WriteValue(Tools[i].Data[j].open);
            Writer.WritePropertyName('low');
            Writer.WriteValue(Tools[i].Data[j].low);
            Writer.WritePropertyName('close');
            Writer.WriteValue(Tools[i].Data[j].close);
            Writer.WriteEndObject;
          end;
          Writer.WriteEndArray;
        end;
        Writer.WriteEndObject;
      end;
      Writer.WriteEndArray;
    end;
    Writer.WriteEndObject;

    SW.WriteLine(StringWriter.ToString);
  finally
    FreeAndNil(Writer);
    FreeAndNil(StringWriter);
    FreeAndNil(SW);
  end;
end;
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725977
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Miracle9,

глянь память, что вообще происходит. возможно что её на самом деле не хватает.
можно порекомендовать библиотеки для замены: SuperObject, XSuperObject.
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39725983
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FS := TFileStream.Create(...);
SW := TStreamWriter.Create(FS);
JTW := TJsonTextWriter.Create(SW);
...
Рейтинг: 0 / 0
Сохранение JSON объекта
    #39726021
Miracle9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievFS := TFileStream.Create(...);
SW := TStreamWriter.Create(FS);
JTW := TJsonTextWriter.Create(SW);
Спасибо Дмитрий, работает!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сохранение JSON объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]