Имя: Пароль:
1C
 
Чтение 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) ну явно не забивание гвоздей микроскопом
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.