Не получается записать JSON

1. aalu14 24.11.22 14:00 Сейчас в теме
Добрый день! Необходимо записать массив JSON формата { [<Number>,<Number>,<Number>,<Number>] }.
Делаю так:

Массив = Новый Массив;
Массив.Вставить("114973");
Массив.Вставить("114974");
Массив.Вставить("114975");
Массив.Вставить("114976");

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Массив);
СтрокаJSON = ЗаписьJSON.Закрыть();
Показать


Получаю:[
null,
null,
null,
....

Подскажите, что делаю не так. Заранее спасибо!
+
По теме из базы знаний
Найденные решения
5. spacecraft 24.11.22 14:26 Сейчас в теме
(4) 1С не понимает множество основных контейнеров. Основной контейнер должен быть только один. А тут массив. Оберните массив в структуру.
VoVo; aalu14; starik-2005; +3
2. Varitano 24.11.22 14:05 Сейчас в теме
Нужно
Массив.Добавить()
VoVo; Anchoret; +2
20. spacecraft 24.11.22 18:04 Сейчас в теме
(19)
Мне именно массив надо возвращать.

Есть еще такой вариант:
[{"договор1": {"1": 1}},{"договор2": {"2": 2}},{"договор3": {"3": 3}}]

Соответственно такой код:
ИтоговыеДанные = Новый Массив;
Для каждого Договор из JSON Цикл
    Детали = Новый Структура;
    Детали.Вставить("policy_no",Номер);
    Детали.Вставить("insuranced_at",Формат(Дата, "ДФ=dd.MM.yyyy"));
    ДанныеДоговоров = Новый Соответствие;
    ДанныеДоговоров.Вставить(Договор,Детали);
    ИтоговыеДанные.Добавить(ДанныеДоговоров);
КонецЦикла; 

ЗаписатьJSON(ЗаписьJSON, ИтоговыеДанные);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Показать
VoVo; aalu14; +2
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Varitano 24.11.22 14:05 Сейчас в теме
Нужно
Массив.Добавить()
VoVo; Anchoret; +2
3. beldieff 24.11.22 14:11 Сейчас в теме
(2)Я и не обратил внимания) Ништяк, в СП индекс должен быть числовым, а тут строку хавает и не давится.
VoVo; aalu14; +2
4. aalu14 24.11.22 14:24 Сейчас в теме
Спасибо, теперь прочесть не могу(
СтрокаЗапроса = ЗаписьJSON.Закрыть();
ЧтениеJSON=Новый ЧтениеJSON;

ЧтениеJSON.УстановитьСтроку(СтрокаЗапроса);
JSON=ПрочитатьJSON(ЧтениеJSON);


Ошибка при вызове метода контекста (ПрочитатьJSON)
JSON=ПрочитатьJSON(ЧтениеJSON);
по причине:
Недопустимое состояние потока записи JSON
+
5. spacecraft 24.11.22 14:26 Сейчас в теме
(4) 1С не понимает множество основных контейнеров. Основной контейнер должен быть только один. А тут массив. Оберните массив в структуру.
VoVo; aalu14; starik-2005; +3
6. aalu14 24.11.22 14:29 Сейчас в теме
7. starik-2005 3036 24.11.22 14:29 Сейчас в теме
(4) Он в структуру пытается читать. Надо структуру с массивом тогда записывать.
aalu14; +1
8. aalu14 24.11.22 14:30 Сейчас в теме
(7)Да, спасибо, уже допер)
+
9. aalu14 24.11.22 17:05 Сейчас в теме
Подскажите, как убрать запятую, не понимаю, где она рисуется...
ЗаписьJSON.ЗаписатьНачалоМассива();

Для каждого Договор из JSON Цикл
               ЗаписьJSON.ЗаписатьИмяСвойства(Договор);
		ЗаписьJSON.ЗаписатьНачалоОбъекта();
		ЗаписьJSON.ЗаписатьИмяСвойства("policy_no");
		ЗаписьJSON.ЗаписатьЗначение(Номер);
		ЗаписьJSON.ЗаписатьИмяСвойства("insuranced_at");
		ЗаписьJSON.ЗаписатьЗначение(Формат(Дата, "ДФ=dd.MM.yyyy"));
		ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла; 

ЗаписьJSON.ЗаписатьКонецМассива();		
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Показать
Прикрепленные файлы:
+
10. spacecraft 24.11.22 17:15 Сейчас в теме
(9) э... какую запятую? Разделитель элементов структуры? Так это стандарт формата json. Не надо ее убирать.
+
11. aalu14 24.11.22 17:19 Сейчас в теме
(10) а почему после первого имени свойства ("114973") она не ставится?
+
12. aalu14 24.11.22 17:20 Сейчас в теме
(10)тот кто принимает джсон попросил убрать эти запятые, а я не понимаю, почему они формируются...Это как бы называние объекта, по логике там не должно быть запятой
+
13. spacecraft 24.11.22 17:24 Сейчас в теме
(12) а, эта запятая. не сразу увидел. Да это лишняя.
Где-то что-то не так открываете или закрываете.
Первое ЗаписьJSON.ЗаписатьИмяСвойства(Договор); Там нет открытия и закрытия объекта.

И все это можно сделать через ЗаписьJSON (загрузкой подготовленной коллекции). Зачем формировать вручную?
+
14. aalu14 24.11.22 17:28 Сейчас в теме
(13) Свойство договор: {открываю объект - свойство policy_no, свойство insuranced_at - закрываю объект}
"Первое ЗаписьJSON.ЗаписатьИмяСвойства(Договор); Там нет открытия и закрытия объекта." - а как надо, подскажите ?
+
15. spacecraft 24.11.22 17:35 Сейчас в теме
(14) У элемента массива нет имен свойств. Он содержит только значения. Имена свойств есть у Структуры. Соответственно сначала необходимо создать ее и закрыть. Как сделано на следующей строке кода для вложенного объекта.
+
16. aalu14 24.11.22 17:43 Сейчас в теме
(15) Вы про ЗаписатьИмяСвойства ЗаписатьЗначениеСвойства ? Но мне необходимо, чтобы формат был такой
[ договор1:{ }, договор2:{ }, договор3:{ } ]
+
17. spacecraft 24.11.22 17:47 Сейчас в теме
(16)
Но мне необходимо, чтобы формат был такой
[ договор1:{ }, договор2:{ }, договор3:{ } ]

Глупости. Это прямое нарушение формата json. Это все что угодно, но не json. Да попробуйте на онлайн валидаторах такое проверить.
+
18. spacecraft 24.11.22 17:51 Сейчас в теме
(17)(16)
Но, если не использовать массив, то вот такой формат:
{"договор1": {"1": 1},"договор2": {"2": 2},"договор3": {"3": 3}}

будет валидным.
И делается просто (в первом приближении на коленке):
ДанныеДоговоров = Новый Соответствие;
Для каждого Договор из JSON Цикл
	Детали = Новый Структура;
	Детали.Вставить("policy_no",Номер);
	Детали.Вставить("insuranced_at",Формат(Дата, "ДФ=dd.MM.yyyy"));
	ДанныеДоговоров.Вставить(Договор,Детали);
КонецЦикла; 

ЗаписатьJSON(ЗаписьJSON, ДанныеДоговоров);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Показать
aalu14; +1
19. aalu14 24.11.22 17:53 Сейчас в теме
(15) Мне именно массив надо возвращать. Вы правы, что неверный формат джсон, спасибо большое!
+
20. spacecraft 24.11.22 18:04 Сейчас в теме
(19)
Мне именно массив надо возвращать.

Есть еще такой вариант:
[{"договор1": {"1": 1}},{"договор2": {"2": 2}},{"договор3": {"3": 3}}]

Соответственно такой код:
ИтоговыеДанные = Новый Массив;
Для каждого Договор из JSON Цикл
    Детали = Новый Структура;
    Детали.Вставить("policy_no",Номер);
    Детали.Вставить("insuranced_at",Формат(Дата, "ДФ=dd.MM.yyyy"));
    ДанныеДоговоров = Новый Соответствие;
    ДанныеДоговоров.Вставить(Договор,Детали);
    ИтоговыеДанные.Добавить(ДанныеДоговоров);
КонецЦикла; 

ЗаписатьJSON(ЗаписьJSON, ИтоговыеДанные);
СтрокаЗапроса = ЗаписьJSON.Закрыть();
Показать
VoVo; aalu14; +2
21. aalu14 25.11.22 09:42 Сейчас в теме
(20) Это то, что нужно, спасибо!!!
+
22. starik-2005 3036 25.11.22 11:12 Сейчас в теме
(9) Вот приличный человек в мое бы время просто бы создал текстовую переменную безо всех этих джисонов, сгенерировав текст кодом с конкатенацией строк. Но нет, народ мучается и кушает кактус, теряя десятки часов )))
Не, я не против джисона - тем более тут задача свелась к массиву соответствий и структур и там все примитивно. Но если вдруг затыки, то вспоминайте про простой текст. Тот же XBRL достаточно непросто писать с помощью объектов 1С, а с помощью записи текста - фигня вопрос.
aalu14; +1
Внимание! Тема сдана в архив

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