Имя: Пароль:
1C
1С v8
Сохранение объекта XDTO в json
0 azernot
 
26.06.20
15:51
Господа, столкнулся с неожиданной проблемой.

Есть пакет XDTO из которого идёт сохранение в XML
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.Отступ = Истина;
    ЗаписьXML.ОткрытьФайл(ИмяФайлаВыгрузки);
    МояФабрикаXDTO.ЗаписатьXML(ЗаписьXML,МоиДанные,,,,НазначениеТипаXML.Явное);
    ЗаписьXML.Закрыть();

На выходе получается кусок следующей структуры:
...
<ТЧ_ИзменениеКоллекции>
    <Строка>
        <Дата>2001-01-01T00:00:00</Дата>
        <Коллекция>НоваяКоллекция</ТретьяКоллекция>
    </Строка>
    <Строка>
        <Дата>2017-04-01T00:00:00</Дата>
        <Коллекция>Сток</ТретьяКоллекция>
        </Строка>
</ТЧ_ИзменениеКоллекции>
...

Сохраняю этот же объект в JSON
    ЗаписьJSON = Новый ЗаписьJSON;
    
    ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,,,Истина,Истина,Истина,Истина,Истина);
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
    МояФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON,МоиДанные,НазначениеТипаXML.Явное);
    СтрокаЗапроса = ЗаписьJSON.Закрыть();

На выходе получаю вот такую стрктуру:

"ТЧ_ИзменениеКоллекции": [
    {
        "Дата": "2001-01-01T00:00:00",
        "Коллекция": "НоваяКоллекция"
    },
    {
        "Дата": "2017-04-01T00:00:00",
        "Коллекция": "Сток"
    }
]

Легко заметить, что теряется имя тэга "Строка".

Как мне добиться, чтобы структура была такая:

"ТЧ_ИзменениеКоллекции": [
    {
        "Строка": {
            "Дата": "2001-01-01T00:00:00",
            "Коллекция": "НоваяКоллекция"
            }
    },
    {
    "Строка": {
            "Дата": "2017-04-01T00:00:00",
            "Коллекция": "Сток"
        }
    }
]
...

Т.е. чтобы не терялось имя тэга "Строка"?
1 ДенисЧ
 
26.06.20
15:55
<Коллекция>НоваяКоллекция</ТретьяКоллекция>

Это что такое за не велформед-хмл?
2 azernot
 
26.06.20
15:58
(1) :)
Ну это мой косяк, неверно отредактировал. Считаем, что закрывающий тэг называется так же, как и открывающий "Коллекция"
3 fisher
 
26.06.20
15:59
Разве что пост-обработкой. Ты же понимаешь, что странно такого хотеть автоматически. Это ведь неравноценные варианты. Для указанного XML это вполне логичный JSON
4 azernot
 
26.06.20
16:02
(3) Логичный? Тупо взял и имя тега съел?
5 pechkin
 
26.06.20
16:05
но зачем лишний тег?
зачем нужен вложенный объект?
6 pechkin
 
26.06.20
16:06
в xml просто нет массивов поэтому без тэга никак
7 fisher
 
26.06.20
16:08
(4) В XML - это служебный тег, обрамляющий элемент коллекции. Эдакий костыль, потому что в XML такой путь. А в JSON другая концепция. В javascript оно и так десериализуется в массив объектов.
8 Ёпрст
 
гуру
26.06.20
16:10
(0) если без фабрики лепить, съедает ?
9 azernot
 
26.06.20
16:13
(8) А как без фабрики? Массивами? Руками текст?
10 Ёпрст
 
гуру
26.06.20
16:14
(9) как обычно, или массив соответствий или массив структур
11 Ёпрст
 
гуру
26.06.20
16:16
Ну и тест на вшивость, через фабрику. Поменяй у пары элементов на <строка1......<Строка2
12 Ёпрст
 
гуру
26.06.20
16:16
Прилетят они в json ? видать 1с-ина не умеет, когда одинаковые элементы в массиве
13 azernot
 
26.06.20
16:18
(11) Ты же понимаешь, что это всё генерится из пакета "XDTO", как же я там поменяю на "Строка1", "Строка2"
14 Ёпрст
 
гуру
26.06.20
16:30
(13) ну, запиши в xml, там поменяй, потом прочитай xml и запиши в жсон
у фабрики же есть вроде метод прочитатьиксэмэл
15 Ёпрст
 
гуру
26.06.20
16:30
для спортивного интереса
16 azernot
 
26.06.20
16:52
(15) Мне кажется ответ очевиден.. Система вообще не воспримет это как массив и запишет всё в свои тэги.
17 Ёпрст
 
гуру
26.06.20
23:04
(16) мне не лень, я проверил, даже с твоей структурой работает как надо :
СтрокаXML = "    
|<ТЧ_ИзменениеКоллекции>
|    <Строка>
|        <Дата>2001-01-01T00:00:00</Дата>
|        <Коллекция>
|            НоваяКоллекция
|        </Коллекция>
|    </Строка>
|    <Строка>
|        <Дата>2017-04-01T00:00:00</Дата>
|        <Коллекция>
|            Сток
|        </Коллекция>
|    </Строка>
|</ТЧ_ИзменениеКоллекции>";
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);
МояФабрикаXDTO = Новый ФабрикаXDTO;
МоиДанные  = МояФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
    ЗаписьJSON = Новый ЗаписьJSON;
    
    ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(,,,,Истина,Истина,Истина,Истина,Истина);
    ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
    МояФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON,МоиДанные,НазначениеТипаXML.Явное);
    СтрокаЗапроса = ЗаписьJSON.Закрыть();
    Сообщить(СтрокаЗапроса);
18 Ёпрст
 
гуру
26.06.20
23:05
ЗЫ: тока я поправил, как в (1)