Как добавить строку в файл JSON

1. eLeMeNtaLe 30.03.21 15:24 Сейчас в теме
Коллеги, добрый день.
Есть файл JSON с простой структурой. Массив, а в нем объекты с двумя свойствами.
[
{
"Свойство_1": "Значение_1",
"Свойство_2": "Значение_2"
},
{
"Свойство_1": "Значение_1",
"Свойство_2": "Значение_2"
}
]

Количество объектов массиве может быть очень много, и обработкой добавляются ещё. Можно ли как-то дописать необходимые объекты в конец массива файла, а не перезаписывать всё содержимое файла каждый раз?
По теме из базы знаний
Найденные решения
9. uno-c 267 30.03.21 22:50 Сейчас в теме
Короче, самому любопытно стало. Исходное содержание файла-ЖСОНа взял Ваше, потом кнопок понажимал и в файрфоксе итоговый ЖСОН открыл - проверил, ошибок ЖСОНа не выдано.

Процедура ТестФайлПотокНаСервере()
	Текст = ",{
	|""Свойство_1"": ""Значение_1"",
	|""Свойство_2"": ""Значение_2""
	|}
	|]";
	Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(Текст);
	ФП = Новый ФайловыйПоток("t:\tmp\jsn.json", РежимОткрытияФайла.Дописать);
	ФП.Перейти(-1, ПозицияВПотоке.Текущая);
	ФП.Записать(Буфер ,0, Буфер.Размер);
	ФП.Закрыть();
КонецПроцедуры
Показать
eLeMeNtaLe; nomad_irk; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 80 30.03.21 15:30 Сейчас в теме
(1) В случае с JSON и другими форматами сериализации данных, совсем не читать файл не получится, т.к. в конце файла содержатся закрывающие теги, а вам нужно "вклиниваться" до этих тегов.

Но если вы прям уверены, что вам нужно только дописать файл, то:

Поток = Новый ЗаписьТекста(ПолноеИмяФайла, , , , Истина);

Поток.Записать("Строка")
поток.ЗаписатьСтроку("Строка");
........
Поток.Закрыть();
6. spacecraft 30.03.21 19:35 Сейчас в теме
(1) просто дописать не читая не получится. По этому формат json мало подходит для ведения логов.
Тут все зависит от того, как этот файл используется дальше для чтения.
Можно предложить такой вариант:
Записывать структуры каждый раз в отдельный файл (скажем с инкрементацией в названии).
При необходимости использования или по заданному периоду, скриптом собирать из разных файлов в единый.
2. platonov.e 160 30.03.21 15:28 Сейчас в теме
Прочитать, добавить, записать.
4. DenisVol 2 30.03.21 15:33 Сейчас в теме
Запись = Новый ЗаписьJSON;
 Запись.ОткрытьФайл("c:\temp\simpleWrite.json");
 Данные = Новый Структура;
 Данные.Вставить("ДлинаЗаписи", 20);
 Данные.Вставить("КлючЗаписи", "abcdefgh");
 Данные.Вставить("ДатаИзменения", ТекущаяДата());
 ЗаписатьJSON(Запись, Данные, );
 Запись.Закрыть();
Показать
5. eLeMeNtaLe 30.03.21 17:06 Сейчас в теме
(4)Ваш код просто перезаписывает файл, т.е. стирает данные в файле и вписывает новые.
7. uno-c 267 30.03.21 22:32 Сейчас в теме
Последний символ в файле заменяем на запятую, дальше, думаю, сами допилите:

&НаСервере
Процедура ТестФайлПотокНаСервере()
	ФП = Новый ФайловыйПоток("t:\tmp\jsn.json", РежимОткрытияФайла.Дописать);
	ФП.Перейти(-1, ПозицияВПотоке.Конец);
	ФП.Записать(ПолучитьБуферДвоичныхДанныхИзСтроки(","),0,1);
КонецПроцедуры
8. uno-c 267 30.03.21 22:35 Сейчас в теме
Если сделать
ФП.Перейти(-1, ПозицияВПотоке.Текущая);
такой же результат получится, как
ФП.Перейти(-1, ПозицияВПотоке.Конец);
т.к. при открытии в режиме .Дописать текущая позиция в конец устанавливается.
9. uno-c 267 30.03.21 22:50 Сейчас в теме
Короче, самому любопытно стало. Исходное содержание файла-ЖСОНа взял Ваше, потом кнопок понажимал и в файрфоксе итоговый ЖСОН открыл - проверил, ошибок ЖСОНа не выдано.

Процедура ТестФайлПотокНаСервере()
	Текст = ",{
	|""Свойство_1"": ""Значение_1"",
	|""Свойство_2"": ""Значение_2""
	|}
	|]";
	Буфер = ПолучитьБуферДвоичныхДанныхИзСтроки(Текст);
	ФП = Новый ФайловыйПоток("t:\tmp\jsn.json", РежимОткрытияФайла.Дописать);
	ФП.Перейти(-1, ПозицияВПотоке.Текущая);
	ФП.Записать(Буфер ,0, Буфер.Размер);
	ФП.Закрыть();
КонецПроцедуры
Показать
eLeMeNtaLe; nomad_irk; +2 Ответить
10. eLeMeNtaLe 31.03.21 09:02 Сейчас в теме
(9)Спасибо, работает.
Не совсем так как я себе представлял, думал есть метод в самомо ЗаписатьJSON установить номер строки с которого начать писать, просто я плохо искал в синтаксис помощнике. Но и ваш метод годный.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот