Ошибка json не определено - IT Справочник
Llscompany.ru

IT Справочник
73 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ошибка json не определено

Ошибка json не определено

Есть скрипт на питоне, который вызывается Zabbix’ом. Скрипт связывается с oVitr ( REST API ) забирает данные в формате JSON, и возвращает ( по крайней мере, пытается ) срипту, который, в свою очередь , должен вернуть их Zabbix’у.
Сами данные считываются без проблем в любых форматах, пробовал тестить curl’ом — всё отлично.
Далее гадание на кофейной гуще — предполагаю, что когда до данных JSON добирается питоновый декодер, скипт останавливается с ошибкой:

Всё это дело работало, пока хосты не перестроили ( rebuild ) и забыли накатить Zabbix. Устанавливали его в ручную, старые роли Ansible утеряны / недоступны. Всё это происходило без меня, тикетов по пересборке не найти, что именно было сделано. короче, нужно разбираться с тем, что есть. Я не программист, программер, который писал скрипт уволился.

Ну хотябы JSON выложил если считаешь что проблема с ним. [source=26:43387:1]

Сам JSON ( и xml так же ) возвращаются без проблем, каких то проблем с JSON не наблюдается, так же есть онлайн ресурс, где можно проверить JSON на ошибки ( синтаксис и т.д. ) — всё нормально.

Сам JSON сейчас выложить не могу. По ошибке, которая приведена выше, что-то можно сказать о проблеме ?

цитата: Издеваетесь над бедной змейкой, подсунули ей пустой файл? [source=26:43387:3]
Да, похоже тело ответа просто банально потеряли где-то в глубинах стека вызовов. А на питончика гонят!

подсунули ей пустой файл? [source=26:43387:3]

Как уже говорил, курлом все возвращается как нужно.

Да, похоже тело ответа просто банально потеряли где-то в глубинах стека вызовов. [source=26:43387:4]

Ну вот здесь и проблема — что и где именно теряется ?

А на питончика гонят! [source=26:43387:4]

Да ну что Вы, к питону самое глубокое уважение.

УПД.: Не понимаю, как тело скрипта вставить правильно.

Добавление от 10.02.2019 12:41:

Добавил, жуть как неудобно реализованно.

цитата (hrjun): Как уже говорил, курлом все возвращается как нужно. код: цитата (hrjun): Ну вот здесь и проблема — что и где именно теряется ? Я бы «за-printf-ил» подозрительные места куда-ть в лог и посмотрел бы. Может есть способы и лучше — хз.

цитата (hrjun): Добавил, жуть как неудобно реализованно. Проследи что спускается внутрь метода json, теряется ли в его недрах или сразу неприходит из get_api_response.
Можно просто разпечатать в лог что получает на вход каждая из функций вниз по стеку метода json().

vertur
Говоря про curl, я имел ввиду, что

curl -X GET -H «Accept: application/json» —cacert cert.cer -u username@internal: passwd https://hostname:443/ovirt-engine/api/hosts/

возвращает ответ без проблем. Вывод засовывал в JSON онлайн валидатор, ошибок не показывает.

Я бы «за-printf-ил» подозрительные места куда-ть в лог и посмотрел бы. [source=26:43387:6]

Это исользовать «print» вместо «return» ?

Добавил, жуть как неудобно реализованно. [source=26:43387:6]

Я имел ввиду, неудобно / не очевидно, как добавить код в пост. Всё время получал plain текст.

Проследи что спускается внутрь метода json, теряется ли в его недрах или сразу неприходит из get_api_response. [source=26:43387:6]

Это тоже самое, что «запринтить» ? Если нет, не могли бы Вы привести пример, на основе скрипта сверху. Если не трудно, конечно.

Спасибо за советы.

цитата (hrjun): Говоря про curl, я имел ввиду, . Я прекрасно это понял. Тем не менее скрипт качает не прямым вызовом curl, а метод JSONDecodeError внятно сообщает про ошибку.

цитата: Это исользовать «print» вместо «return» ? Не вместо, а перед.
Но то, про что я говорил подразуемает print не в конце функции, а в начале, первой же строкой в ее теле.
Просто распечатайте в лог нужные аргументы функции при ее вызове и посмотрите на это в дереве вызовов.

цитата: Это тоже самое, что «запринтить» ? Это не тоже самое, но может использовать print в качестве решения.

цитата: не могли бы Вы привести пример, на основе скрипта сверху. Если не трудно, конечно. Потом может быть, на этой неделе некогда.

hrjun
Если нет, не могли бы Вы привести пример, на основе скрипта сверху. Если не трудно, конечно.
[source=26:43387:7]

Примерно так. Вместо:

код: пишем логгирование всего, что у нас есть.

код: Я бы также задампил полный состав сессии в get_api_response, чтобы знать, откуда читаем.

Судя по твоему коду, JSON просто исчез из сессии. Так что можно предположить, что или сессию неправильную используешь, или она зарезетилась, или вообще сессия в данном сценарии непременима (мне лень разбираться в питонном веб-апи, да и неважно это щас).

Для кода используй (без пробелов между скобками и code):

[ code ]
здесь твой код
[/ code ]

Заметки из Зазеркалья

Реализовано в версии 8.3.6.1977.

JSON (JavaScript Object Notation) это текстовый формат обмена данными, широко используемый в веб-приложениях. По сравнению с XML он является более лаконичным и занимает меньше места. Кроме этого все браузеры имеют встроенные средства для работы с JSON.

Необходимость работы с этим форматом на уровне платформы обусловлена не только тем, что это «модный современный» формат, который прикладные решения 1С:Предприятия сами по себе могут использовать для интеграции со сторонними приложениями. Другая причина заключается ещё и в том, что JSON активно используется в HTTP интерфейсах. А в 1С:Предприятии как раз есть такие механизмы, в которых хочется использовать этот формат. Это REST интерфейс приложения, автоматически генерируемый платформой, и HTTP-сервисы, которые вы можете создавать самостоятельно.

Мы видим несколько основных сценариев использования JSON.

Во-первых, это интеграция с внешними системами через их HTTP интерфейсы: Google Calendar, Salesforce.com, REST интерфейс 1С:Предприятия, SharePoint и т.д.

Во-вторых, это организация собственного HTTP интерфейса прикладного решения.

В-третьих, обмен файлами JSON с внешними системами. Формирование конфигурационных, настроечных файлов. Использование их в процедурах обмена данными, например, с интернет-магазинами.

Читать еще:  Ошибка ae default biz error msg

В-четвертых, это использование файлов JSON для обмена данными между разными приложениями 1С:Предприятия.

В платформе мы реализовали несколько слоёв работы с JSON. Самые простые и гибкие — это низкоуровневые средства потоковой записи и чтения. Более высокоуровневые и не такие универсальные — средства сериализации в JSON примитивных типов и коллекций 1С:Предприятия.

Потоковое чтение и запись JSON

Объекты потоковой работы — это общие объекты ЧтениеJSON и ЗаписьJSON. Они последовательно читают JSON из файла или строки, или последовательно записывают JSON в файл или строку. Таким образом, чтение и запись JSON происходят без формирования всего документа в памяти.

В качестве иллюстрации потокового чтения JSON можно привести следующий пример:

При записи JSON вы самостоятельно формируете его структуру. Чтобы «подстраховать» вас от ошибок, объект ЗаписьJSON автоматически проверяет правильность записываемой структуры. Для увеличения скорости работы эту проверку можно отключить. В примере ниже это строка:

Также при записи вы можете управлять некоторыми параметрами формируемого текста, например использованием двойных кавычек, переносом строк, символами отступа и экранированием символов. В примере ниже для форматирования текста используется символ табуляции:

Потоковая запись JSON может выглядеть следующим образом. Записывается массив из четырёх элементов. Три из них примитивного типа, а четвёртый элемент — это объект с двумя свойствами:

Результат такой записи:

Сериализация примитивных типов и коллекций в JSON

Вторая группа средств работы с JSON хороша тем, что избавляет вас от рутинной работы по чтению/записи каждого отдельного значения или свойства. При чтении документы JSON отображаются в фиксированный набор типов платформы: Строка, Число, Булево, Неопределено, Массив, ФиксированныйМассив, Структура, ФиксированнаяСтруктура, Соответствие, Дата. Соответственно, в обратную сторону, композиция объектов этих типов позволяет сформировать в памяти и быстро записать в файл структуру JSON. Таким образом, чтение и запись небольшого объема JSON заранее известной структуры можно производить немногими строчками кода.

Основное назначение этих средств мы видим в обмене информацией с внешними системами, чтении конфигурационных файлов в формате JSON.

Сериализацию вы можете выполнять с помощью методов глобального контекста ПрочитатьJSON() и ЗаписатьJSON(). Они работают в связке с объектами ЧтениеJSON и ЗаписьJSON.

В качестве примера десериализации JSON можно рассмотреть чтение массива из двух объектов:

Код 1С:Предприятия, выполняющий десериализацию, может выглядеть следующим образом:

А пример сериализации (записи) в JSON может выглядеть так:

Функции преобразования и восстановления при сериализации

Не всегда сериализация может быть выполнена полностью автоматически. В жизни встречаются самые разные ситуации. Поэтому мы добавили возможность использовать «самописную» функцию обработки значений при записи в JSON и при чтении из JSON.

В методе ЗаписатьJSON() она называется Функция преобразования и описывается с помощью трёх параметров:

  • ИмяФункцииПреобразования;
  • МодульФункцииПреобразования;
  • ДополнительныеПараметрыФункцииПреобразования.

В методе ПрочитатьJSON() она называется Функция восстановления и для неё есть аналогичные параметры:

  • ИмяФункцииВосстановления;
  • МодульФункцииВосстановления;
  • ДополнительныеПараметрыФункцииВосстановления.

При записи в JSON эта функция полезна потому, что позволяет самостоятельно преобразовать в JSON те типы, которые не подлежат автоматическому преобразованию. Или даже совсем отказаться от их сериализации.

Например, так оказалось, что в записываемой структуре одно из значений — это ссылка на элемент справочника ПодразделенияОрганизаций. Такое значение (ссылка на объект 1С:Предприятия) не может быть автоматически сериализовано средствами платформы. Тогда, используя функцию преобразования, мы можем получить для этого значения его строковое представление в удобном виде. Например, в виде строки «ИП Петров: Отдел рекламы».

Результат выполнения примера:

При чтении из JSON функция восстановления может использоваться для того, чтобы преобразовать данные JSON в типы 1С, которые не могут являться результатом автоматического преобразования, или для того, чтобы самостоятельно (не автоматически) преобразовать даты JSON в даты 1С:Предприятия.

Сериализация типа Дата

Данные типа Дата сериализуются в JSON автоматически, а вот обратное преобразование (десериализация) может быть выполнено не всегда. JSON не содержит типа Дата, значения даты представляются в нём строкой. Конечно, существуют некоторые форматы представления дат, но вообще говоря, внешний вид такой строки может быть самым разнообразным.

Для сериализации типа Дата в JSON у метода ЗаписатьJSON() вы можете использовать параметр НастройкиСериализации. Это объект встроенного языка, который позволяет указать, в каком варианте будет записана дата (UTC, локальная дата или локальная дата со смещением) и в каком формате (ISO, JavaScript или Microsoft).

При чтении даты из JSON всё обстоит сложнее. В параметре ИменаСвойствСоЗначениямиДата вы можете перечислить те свойства JSON, значения которых нужно преобразовать в дату 1С:Предприятия (тип Дата). А в параметре ОжидаемыйФорматДаты вам нужно указать, в каком формате эти данные содержатся в JSON (ISO, JavaScript или Microsoft).

Однако если окажется, что в какой-то момент формат данных JSON не совпадает с ожидаемым форматом, будет вызвано исключение.

В такой ситуации, для большей универсальности, вы можете включить те же самые свойства JSON в массив, подлежащий обработке функцией восстановления — ИменаСвойствДляОбработкиВосстановления. И уже в функции восстановления вы самостоятельно десериализуете даты JSON, в каком бы формате они ни были представлены.

Использование JSON в HTTP интерфейсах приложений

Автоматически генерируемый REST интерфейс прикладных решений

При обращении к REST интерфейсу прикладного решения вы можете получать ответ в формате JSON. Для этого в адресной строке вам нужно указать параметр $format=json. Либо указать MIME тип «application/json» в заголовке Accept HTTP запроса. Например:

Вы можете управлять объёмом передаваемой информации за счёт изменения детальности представления метаданных в выгрузке. Существуют три уровня: Nometadata, Minimalmetadata и Fullmetadata. По-умолчанию (на примере вверху) используется средний уровень — Minimalmetadata. На уровне Nometadata объём передаваемой информации минимальный, а на уровне Fullmetadata — максимальный. Однако при этом нужно понимать, что сокращение объёма передаваемой информации приводит к более интенсивным вычислениям на клиенте. И наоборот, когда вся информация включается в выгрузку, объём вычислений на клиенте будет минимальным.

Читать еще:  1с ошибка идентификации пользователя

Детальность представления метаданных вы можете указать, например, в адресной строке.

Сведения о метаданных не передаются:

Вся информация о метаданных включается в выгрузку:

HTTP-сервисы прикладного решения

HTTP-сервисы, реализованные в прикладном решении, также могут возвращать ответ в формате JSON. Для этого вам проще всего сформировать тело ответа в JSON, получить его как строку, а затем установить из этой строки тело HTTP ответа сервиса. При этом желательно указать, что BOM (Byte Order Mark, метка порядка байтов) использоваться не должна.

Последний параметр (ИспользованиеByteOrderMark.НеИспользовать) вы можете и не указывать, если режим совместимости конфигурации не установлен, или он больше чем Версия8_3_5. Потому что в этом случае BOM автоматически будет использоваться только для кодировок UTF-16 и UTF-32, а для UTF-8, UTF-16LE/UTF-16BE, UTF-32LE/UTF-32BE и других она использоваться не будет.

Взаимодействие со сторонними HTTP сервисами

При взаимодействии со сторонними HTTP интерфейсами у вас также может возникнуть необходимость формирования запросов к ним в формате JSON. В этом случае алгоритм ваших действий будет аналогичным. Формируете тело запроса в JSON. Получаете тело в виде строки. Из этой строки устанавливаете тело HTTP запроса. BOM не используете.

Дальнейшее развитие

Мы думаем над тем, чтобы предоставить вам возможность сериализации в JSON прикладных типов 1С:Предприятия: ссылок, объектов, наборов записей и т.д. Поэтому есть вероятность появления ещё одного, третьего уровня средств работы с JSON. Этот уровень позволит вам преобразовывать в JSON любые типы 1С:Предприятия, для которых поддерживается XDTO-сериализация в XML.

JSON error request is not defined

When I do console.log(req.responsetext) i get [11:38:04.967] ReferenceError: req is not defined. But i define req as a new xml request on window load so I am kind of stumped. Is there a way that I should be passing a reference?

the console output is as follows

Any and all help would be most gratefully appreciated. Thank you to anyone who takes the time to read and/or answer even if you cannot help!

edit this is my php page that echos the json.

Создан 07 май. 13 2013-05-07 19:35:16 Chris

Where are you actually calling ‘console.log(req.responseText)’? – Ian 07 май. 13 2013-05-07 19:37:41

in my console when i debug with firebug – Chris 07 май. 13 2013-05-07 19:38:06

Why do you expect ‘req’ to be defined? You define it **inside** of ‘window.onload’, so that’s the scope that it’s defined. It’s not defined in the global scope (where the console executes) – Ian 07 май. 13 2013-05-07 19:38:49

I am running current verison of firefox. Should i put console.log in the file and see what it says? – Chris 07 май. 13 2013-05-07 19:39:34

If you ‘console.log’ something where it’s defined, then yes, it should output something. The ‘window.onload’ scope isn’t the same as the global scope. – Ian 07 май. 13 2013-05-07 19:40:27

You probably want to move ‘var req = new XMLHttpRequest();’ **into** ‘getSuggestions’ – Ian 07 май. 13 2013-05-07 19:41:22

So I moved the var req inside and it still is not working. I am pretty sure my json encoding is right, so the only thing I think it can be is that html request – Chris 07 май. 13 2013-05-07 19:50:37

Chris have you tried removing var? – Peter Bartels 07 май. 13 2013-05-07 19:51:03

Because if you move it inside you still have a scope prob – Peter Bartels 07 май. 13 2013-05-07 19:54:08

@PeterBartels If you remove ‘var’, you’ll only ever be able to send 1 AJAX request (which is what’s currently happening anyways). That’s not what they want at all. Every time ‘getSuggestions’ is called, it needs to make a new request (meaning, it needs to make a **new** ‘XMLHttpRequest’). – Ian 07 май. 13 2013-05-07 19:57:24

When I removed the var and put it back in the window on load i still get [12:57:46.146] SyntaxError: JSON.parse: unexpected character @ search.php:22. This is line 22 for reference var response = JSON.parse(req.responseText); – Chris 07 май. 13 2013-05-07 19:58:58

Nope that’s why he uses req.open you’ll only need to instantiate it once – Peter Bartels 07 май. 13 2013-05-07 19:59:21

Which character is on line 22. It’s a php problem too! – Peter Bartels 07 май. 13 2013-05-07 20:00:45

this is line 22 for reference var response = JSON.parse(req.responseText); – Chris 07 май. 13 2013-05-07 20:02:15

What’s that trailing comma doing there in the array? – Peter Bartels 07 май. 13 2013-05-07 20:02:15

@PeterBartels That doesn’t matter. If things happen fast enough, things get overwritten, which is not desired. You need to create a new ‘XMLHttpRequest’ for every request. – Ian 07 май. 13 2013-05-07 20:04:11

Oh wow, trailing comma! Well it’s not throwing the error anymore but still not popping up in my div grrrrrrrr – Chris 07 май. 13 2013-05-07 20:05:52

It is adding the divs for the suggestions but the content in them is null. – Chris 07 май. 13 2013-05-07 20:09:06

How would I debug to see what response[i].terms contains? – Chris 07 май. 13 2013-05-07 20:17:42

Nevermind I am an idiot. I forgot I changed my database from terms to word – Chris 07 май. 13 2013-05-07 20:28:59

json_last_error

(PHP 5 >= 5.3.0, PHP 7)

json_last_error — Возвращает последнюю ошибку

Описание

Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .

Читать еще:  Ошибка c0000022 при операции обновления

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение, которое может быть одной из следующих констант:

Примеры

Пример #1 Пример использования json_last_error()

Результат выполнения данного примера:

Пример #2 Совместное использование json_last_error() и json_encode()

Результат выполнения данного примера:

Пример #3 json_last_error() и JSON_THROW_ON_ERROR

Результат выполнения данного примера:

Смотрите также

  • json_last_error_msg() — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
  • json_decode() — Декодирует строку JSON
  • json_encode() — Возвращает JSON-представление данных

User Contributed Notes 7 notes

While this can obviously change between versions, the current error codes are as follows:

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

I’m only posting these for people who may be trying to understand why specific JSON files are not being decoded. Please do not hard-code these numbers into an error handler routine.

use this code with mb_convert_encoding, you can json_encode some corrupt UTF-8 chars

function utf8ize($mixed) <
if (is_array($mixed)) <
foreach ($mixed as $key => $value) <
$mixed[$key] = utf8ize($value);
>
> elseif (is_string($mixed)) <
return mb_convert_encoding($mixed, «UTF-8», «UTF-8»);
>
return $mixed;
>

I used this simple script, flicked from StackOverflow to escape from the function failing:

$v ) <
$d [ $k ] = utf8ize ( $v );
>
> else if ( is_string ( $d )) <
return utf8_encode ( $d );
>
return $d ;
>
?>

Just adding this note since I had to code this for the actual values reference.

here is a small updated version of utf8ize that has the following addition :
* It uses iconv instead of utf8_encode for potentially better result.
* It adds the support of objects variable
* It also update array key value (in a case I met I had to utf8ize the key as well as those were generated from a user input value)

Here is the code.

$v ) <
unset( $d [ $k ]);
$d [ utf8ize ( $k )] = utf8ize ( $v );
>
> else if ( is_object ( $d )) <
$objVars = get_object_vars ( $d );
foreach( $objVars as $key => $value ) <
$d -> $key = utf8ize ( $value );
>
> else if ( is_string ( $d )) <
return iconv ( ‘UTF-8’ , ‘UTF-8//IGNORE’ , utf8_encode ( $d ));
>
return $d ;
>
?>

This is a quite simple and functional trick to validate JSON’s strings.

json_decode () возвращает null проблемы

У меня проблема с моим JSON. Он корректно работает в PHP 5.3 (поэтому я не могу использовать json_last_error ()), и он успешно возвращается, когда я скопирую строку явно в json_decode (json_decode (‘<…>‘). Он возвращает только null, когда я пропускаю результат как переменная, и я использую php 5.2, для чего мне это нужно.

Вывод происходит из записи JSON в PHPUnit:

EDIT: Это пути, которые я изучал – возможно, вы лучший исследователь. Три возможных пути, которые могли бы помочь:

  • Чем отличается json_decode () в php 5.2, то 5.3? что они изменили?
  • Кто-то еще использует JSON из PHPUnit и как они анализируют его.
  • Что изменится, когда вы имеете его в переменной или распечатываете его на экране и копируете его в json_decode ()

Любая помощь будет очень (!) Оценена.

Какая УДОБНАЯ отладочная сессия. Хорошо, есть хорошие новости. Я понял это.

Я начал смотреть на него с помощью AJAX и записывать его с помощью Firebug … и получается, что json_decode (или eval между прочим) не может обрабатывать " , и это то, что PHPUnit отправляет обратно (Приходите на Себастьяна!), чтобы исправить это:

Теперь я думал, что они такие же … может, кто-то может просветить меня ..

Вчера я потратил 2 часа на проверку и исправление этой ошибки, наконец, я обнаружил, что в строке JSON, которую я хотел декодировать, были «» слэши. Итак, логично, что нужно использовать функцию stripslashes или что-то похожее на разные PL.

Конечно, лучший способ – это порог, чтобы напечатать этот var out и посмотреть, что он будет после json_decode, если он равен null, вы также можете использовать функцию json_last_error (), чтобы определить ошибку, в которой он вернет целое число, но здесь описаны те int:

В моем случае я получил вывод json_last_error () как номер 4, поэтому это JSON_ERROR_SYNTAX . Затем я пошел и заглянул в строку, которую я хотел преобразовать, и она была в последней строке:

После этого это просто простое решение.

Когда я использую:

(используя PHPUnit 3.4.13), Файл, который он создает, не содержит действительных JSON,

json-файл содержит «json», который выглядит примерно так:

Вместо того, что я ожидаю увидеть:

Не уверен, что та же проблема, что вы видите, ваш образец JSON-вывода в вопросе выглядит более достоверным, чем то, что я вижу.

После добавления отсутствующих запятых и скобок он может быть проанализирован с помощью json_decode () на PHP 5.2.10 или PHP 5.3.2.

Попробуйте эту проблему, это html_entity_decode ($ ваше значение);

Вы должны использовать это

Я тестировал это с помощью PHP 5.3

попробуйте установить отчет об ошибках во ВСЕХ, json_decode () должен предоставить вам уведомление в смещении, где преобразование завершается с ошибкой.

Полезное сообщение от Себастьяна о формате json

Использование предложения Кейта позволит правильно анализировать данные

Я замечаю это поведение с PHP версии 5.14.12, и это может быть и для других версий.
При использовании file_get_contents для загрузки строки JSON в функцию json_decode мне пришлось снимать символы спецификации, то есть для UTF-8 EF BB BF, прежде чем она будет работать должным образом.
Сравните длины ваших двух строк – жестко закодированные по сравнению с переданными в переменной – если они не совпадают, эти символы могут быть виновниками.

Вы можете установить кодировку базы данных перед отправкой – решить проблемы на моем конце:

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector