|
Чтение 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) ну явно не забивание гвоздей микроскопом
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |