|   |   | 
| 
 | Чтение JSON фабрикой XDTO. Непонятная ошибка | ☑ | ||
|---|---|---|---|---|
| 0
    
        TormozIT гуру 14.12.22✎ 10:27 | 
        Имею текст
 { "#value": 0, "Don1": 1, "Don2": 2 } Пытаюсь читать его кодом Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(в1); Пустышка = ФабрикаXDTO.ПрочитатьJSON(Чтение, ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "double")); Число = ФабрикаXDTO.ПрочитатьJSON(Чтение, ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "double")); Число = ФабрикаXDTO.ПрочитатьJSON(Чтение, ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "double")); Чтение.Закрыть(); На 3-м вызове ПрочитатьJSON() получаю очень короткую ошибку: Ошибка при вызове метода контекста (ПрочитатьJSON) Почему? | |||
| 1
    
        Адинэснег 14.12.22✎ 10:44 | 
        если в другую переменную записать, тоже падает?     | |||
| 2
    
        Адинэснег 14.12.22✎ 10:47 | 
        а когда ключ без решетки?     | |||
| 3
    
        anatoly 14.12.22✎ 10:53 | 
        (0) а зачем JSON вообще читать через XDTO??
 Есть же давно в 8.3 "ЧтениеJSON (JSONReader)" Доступен, начиная с версии 8.3.6. | |||
| 4
    
        Адинэснег 14.12.22✎ 10:53 | 
        а это же объект     | |||
| 5
    
        TormozIT гуру 14.12.22✎ 10:54 | 
        (3) Потому что нет описания структуры первого уровня, но есть описание всех типов значений свойств, включая объектные.     | |||
| 6
    
        Адинэснег 14.12.22✎ 10:57 | 
        Объ= ФабрикаXDTO.ПрочитатьJSON(Чтение, ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core", "map"));     | |||
| 7
    
        TormozIT гуру 14.12.22✎ 11:00 | 
        (6) Тогда все вложенные объекты будут иметь неправильную структуру и типы значений.     | |||
| 8
    
        Адинэснег 14.12.22✎ 11:03 | 
        тогда свое пилить в ПрочитатьJSON
 <ИмяФункцииВосстановления> (необязательный) Тип: Строка. Данная функция вызывается при чтении каждого свойства и должна иметь следующие параметры: <Свойство> - значение типа Строка, указывается только при чтении объектов JSON, <Значение> - значение допустимого для сериализации типа, <ДополнительныеПараметры>. | |||
| 9
    
        polosov 14.12.22✎ 13:20 | 
        (0) А где ты взял такое свойство? 
 Свойство должно выглядеть так: {"#value": {"Свойство1": 0.12334}} | |||
| 10
    
        polosov 14.12.22✎ 13:30 | 
        (0) Обрати внимание на свойство ТекущаяПозиция у Чтение после первого чтения. Оно убегает довольно далеко. Фабрика не может понять формат твоего свойства.     | |||
| 11
    
        TormozIT гуру 15.12.22✎ 13:42 | 
        Решение
 в1="{ | ""#value"": 0, | ""Don1"": 1, | ""Don2"": 2 |}"; Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(в1); тд = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "double"); Чтение.Прочитать(); // пропускаем начало объекта Чтение.Прочитать(); // пропускаем начало свойства // позиция - на начале имени свойства ("#value": 0) Пустышка = ФабрикаXDTO.ПрочитатьJSON(Чтение, тд); // читаем значение из пары "#value": 0 Чтение.Прочитать(); // пропускаем начало свойства // позиция - на начале имени свойства ("Don1": 1) Число1 = ФабрикаXDTO.ПрочитатьJSON(Чтение, тд); // читаем значение из пары "Don1": 1 Чтение.Прочитать(); // пропускаем начало свойства !!!! // позиция - на начале имени свойства ("Don2": 2) Число2 = ФабрикаXDTO.ПрочитатьJSON(Чтение, тд); // читаем значение из пары "Don2": 2 Чтение.Закрыть(); | |||
| 12
    
        polosov 15.12.22✎ 14:51 | 
        (11)     в1="{
 | ""#value"": 0, | ""Don1"": 1, | ""Don2"": 2 |}"; Чтение = Новый ЧтениеJSON; Чтение.УстановитьСтроку(в1); Данные = ПрочитатьJSON(Чтение, Истина); Чтение.Закрыть(); | |||
| 13
    
        TormozIT гуру 15.12.22✎ 16:06 | 
        (12) Считай то же самое что и (6). Вложенные типы потеряешь.     | |||
| 14
    
        polosov 15.12.22✎ 16:36 | 
        (13) Тут как бы дел в том, что ты фабрикой делаешь приведение типов. Ты не читаешь данные согласно схеме фабрики. 
 Т.е. ты гаечным ключом откручиваешь шуруп. Да, можно это сделать. Но проще прочитать в соответствие и при необходимости привести типы. | |||
| 15
    
        TormozIT гуру 15.12.22✎ 17:31 | 
        (14) Я уже предоставил подходящее решение своей задачи. Зачем ты написал свое, если знал что оно сломает шуруп?     | |||
| 16
    
        Fragster гуру 15.12.22✎ 18:35 | 
        (15) решение совсем не то, (14) прав. Фабрика предназначена в бОльшей степени на сериализацию и  проверку сложных структур объектов, в данном случае она не нужна, может быть пример слишком синтетический. Для начала неплохо бы посмотреть на код, который формирует данный json.
 А в решении (6) использование фабрики избыточно. Оно нужно для приведения типов, но тогда там на одном уровне будет опциональный #type и #value со значением, примитивного или объектного типа. В данном конкретном случае приведение и не нужно, можно использовать прочитатьJson напрямую в соответствие и всё. Может быть в случае с датой, но там это тоже решается другим способом - через указание дополнительного параметра. | |||
| 17
    
        TormozIT гуру 15.12.22✎ 18:42 | 
        (16) Вам всем виднее. Какое решение мне нужно)     | |||
| 18
    
        ДедМорроз 16.12.22✎ 11:17 | 
        А вообще,как вы пытветесь читать объект по частям.
 Нужно описать в фабрике весь объект и читать его за один раз. Просто,в вашем случае,он натыкается на конец объекта и не может понять,что с этим делать. Опять же ни в json ни в 1с типа double нету. Есть тип число,а мы его уже на уровне фабрики преобразуем в описание типа фабрики. И,самое главное, никто не обещает правильный порядок полей объекта при использовании стандартной сериализации в родном json, пожтому,если вы в XDTO-типах описали внсь объект,то перестановка полей не страшна. | |||
| 19
    
        Fragster гуру 16.12.22✎ 12:47 | 
        (17) ну явно не забивание гвоздей микроскопом     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |