-
Home
- php — Could not decode JSON, syntax error — malformed JSON
760 votes
2 answers
Get the solution ↓↓↓
I am sending an AJAX POST with JSON data to a Symfony2 controller. Without any data specified, the controller does create an empty record and returns success (no errors). However, when I pass data in POST it gives me the error shown in title. Here is my code for AJAX:
$.ajax({
dataType: "json",
type: "POST",
data: {
"useruid": "Nothing",
"type": "Office in Space",
"latitude": "12",
"longitude": "100",
"displayed": "true",
"public": "true",
"verified": "true",
"street": "Something",
"city": "Something",
"country": "Space",
"region": "North Space",
"created": "2009-03-07T00:00:00-0500",
"delete_status": "active"
},
url: "/web/app_dev.php/address/",
success: function (responseText)
{
console.log("Request was successful, data received: " + JSON.stringify(responseText));
},
error: function (error) {
alert(JSON.stringify(error));
}
});
To deserialize the JSON, here is my controller code:
public function createAction(Request $request)
{
$content = $this->get('request')->getContent();
var_dump($content);
$serializer = $this->get('jms_serializer');
$entity = $serializer->deserialize($content, 'NameNameBundleEntityAddress', 'json');
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}
I am using JMSSerializer bundle. What is the reason why it cannot decode the JSON? I validated my JSON with JSONlint and it was okay. Any ideas?
** Edited code: Added Entity Class **
namespace FactoryWebServicesBundleEntity;
use DoctrineORMMapping as ORM;
use JMSSerializerAnnotationType;
/**
* Address
* @ORMTable(name="address")
* @ORMEntity
*/
class Address
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
* @JMSSerializerAnnotationType("integer")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="useruid", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $useruid;
/**
* @var string
*
* @ORMColumn(name="type", type="string", nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $type;
/**
* @var string
*
* @ORMColumn(name="latitude", type="string", length=120, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $latitude;
/**
* @var string
*
* @ORMColumn(name="longitude", type="string", length=120, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $longitude;
/**
* @var boolean
*
* @ORMColumn(name="displayed", type="boolean", nullable=true)
* @JMSSerializerAnnotationType("boolean")
*/
private $displayed;
/**
* @var boolean
*
* @ORMColumn(name="public", type="boolean", nullable=true)
* @JMSSerializerAnnotationType("boolean")
*/
private $public;
/**
* @var boolean
*
* @ORMColumn(name="verified", type="boolean", nullable=true)
* @JMSSerializerAnnotationType("boolean")
*/
private $verified;
/**
* @var string
*
* @ORMColumn(name="street", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $street;
/**
* @var string
*
* @ORMColumn(name="city", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $city;
/**
* @var string
*
* @ORMColumn(name="country", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $country;
/**
* @var string
*
* @ORMColumn(name="locality", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $locality;
/**
* @var string
*
*
* @ORMColumn(name="region", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $region;
/**
* @var string
*
*
* @ORMColumn(name="code", type="string", length=100, nullable=true)
* @JMSSerializerAnnotationType("string")
*
*/
private $code;
/**
*
* @var string
*
*
* @ORMColumn(name="pobox", type="string", length=100, nullable=true)
* @JMSSerializerAnnotationType("string")
*
*/
private $pobox;
/**
* @var string
*
*
* @ORMColumn(name="telephone", type="string", length=60, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $telephone;
/**
* @var string
*
*
* @ORMColumn(name="cellphone", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $cellphone;
/**
* @var string
*
*
* @ORMColumn(name="email", type="string", length=200, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $email;
/**
* @var string
*
*
* @ORMColumn(name="facsmile", type="string", length=60, nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $facsmile;
/**
* @var DateTime
*
*
* @ORMColumn(name="created", type="datetime", nullable=true)
* @JMSSerializerAnnotationType("DateTime")
*/
private $created;
/**
* @var DateTime
*
*
* @ORMColumn(name="modified", type="datetime", nullable=true)
* @JMSSerializerAnnotationType("DateTime")
*/
private $modified;
/**
* @var string
*
*
* @ORMColumn(name="delete_status", type="string", nullable=true)
* @JMSSerializerAnnotationType("string")
*/
private $deleteStatus;
2022-03-13
Write your answer
245
votes
Answer
Solution:
You have to instruct the JMS Serializer in how to deserialize your fields.
You can do that by using annotations, e.g.@JMSSerializerAnnotationType("string")
The JMS Serializer documentation lists all possible types.
Just to be clear, you put the annotation on every field of your entity that you want to be deserialized, e.g.
/**
* @var string
*
* @JMSSerializerAnnotationType("string")
* @ORMColumn(name="street", type="string", length=200, nullable=true)
*/
private $street;
Hope this helps…
890
votes
Share solution ↓
Additional Information:
Date the issue was resolved:
2022-03-13
Link To Source
Link To Answer
People are also looking for solutions of the problem: dompdf image not found or type unknown
Didn’t find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.
About the technologies asked in this question
PHP
PHP (from the English Hypertext Preprocessor — hypertext preprocessor) is a scripting programming language for developing web applications. Supported by most hosting providers, it is one of the most popular tools for creating dynamic websites.
The PHP scripting language has gained wide popularity due to its processing speed, simplicity, cross-platform, functionality and distribution of source codes under its own license.
https://www.php.net/
Symfony
Symfony compares favorably with other PHP frameworks in terms of reliability and maturity. This framework appeared a long time ago, in 2005, that is, it has existed much longer than most of the other tools we are considering. It is popular for its web standards compliance and PHP design patterns.
https://symfony.com/
JavaScript
JavaScript is a multi-paradigm language that supports event-driven, functional, and mandatory (including object-oriented and prototype-based) programming types. Originally JavaScript was only used on the client side. JavaScript is now still used as a server-side programming language. To summarize, we can say that JavaScript is the language of the Internet.
https://www.javascript.com/
JQuery
JQuery is arguably the most popular JavaScript library with so many features for modern development. JQuery is a fast and concise JavaScript library created by John Resig in 2006. It is a cross-platform JavaScript library designed to simplify client-side HTML scripting. Over 19 million websites are currently using jQuery! Companies like WordPress, Facebook, Google, IBM and many more rely on jQuery to provide a kind of web browsing experience.
https://jquery.com/
Welcome to programmierfrage.com
programmierfrage.com is a question and answer site for professional web developers, programming enthusiasts and website builders. Site created and operated by the community. Together with you, we create a free library of detailed answers to any question on programming, web development, website creation and website administration.
Get answers to specific questions
Ask about the real problem you are facing. Describe in detail what you are doing and what you want to achieve.
Help Others Solve Their Issues
Our goal is to create a strong community in which everyone will support each other. If you find a question and know the answer to it, help others with your knowledge.
Содержание
- PHP JSON
- Вступление
- Синтаксис
- параметры
- замечания
- Декодирование строки JSON
- Кодирование строки JSON
- аргументы
- JSON_FORCE_OBJECT
- JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
- JSON_NUMERIC_CHECK
- JSON_PRETTY_PRINT
- JSON_UNESCAPED_SLASHES
- JSON_UNESCAPED_UNICODE
- JSON_PARTIAL_OUTPUT_ON_ERROR
- JSON_PRESERVE_ZERO_FRACTION
- JSON_UNESCAPED_LINE_TERMINATORS
- Отладка ошибок JSON
- json_last_error_msg
- json_last_error
- Использование JsonSerializable в объекте
- пример значений свойств.
- Использование частных и защищенных свойств с помощью json_encode()
- Выход:
- Заголовок json и возвращаемый ответ
- PHP: json_encode / json_decode error handling.
- Парсинг многоэтажного json?
PHP
JSON
Вступление
JSON ( JavaScript Object Notation ) — это независимый от платформы и язык способ сериализации объектов в открытый текст. Поскольку он часто используется в Интернете, а также PHP, существует базовое расширение для работы с JSON в PHP.
Синтаксис
- string json_encode (mixed $ value [, int $ options = 0 [, int $ depth = 512]])
- смешанный json_decode (строка $ json [, bool $ assoc = false [, int $ depth = 512 [, int $ options = 0]]])
параметры
параметр | подробности |
---|---|
json_encode | — |
значение | Кодирование значения. Может быть любым типом, кроме ресурса. Все строковые данные должны кодироваться в кодировке UTF-8. |
опции | Бит-маска, состоящая из JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR. Поведение этих констант описано на странице констант JSON . |
глубина | Установите максимальную глубину. Должно быть больше нуля. |
json_decode | — |
JSON | Строка json декодируется. Эта функция работает только с закодированными строками UTF-8. |
ассоциативный | Функция должна возвращать ассоциативный массив вместо объектов. |
опции | Бит-маска параметров декодирования JSON. В настоящее время поддерживается только JSON_BIGINT_AS_STRING (по умолчанию используется большое число целых чисел в виде поплавков) |
замечания
- Обработка json_decode недопустимого JSON очень шелушащая, и очень сложно надежно определить, удалось ли декодировать, json_decode возвращает значение null для недопустимого ввода, хотя null также является вполне допустимым объектом для JSON для декодирования. Чтобы предотвратить такие проблемы, вы всегда должны вызывать json_last_error каждый раз, когда используете его.
Декодирование строки JSON
Функция json_decode() принимает JSON-кодированную строку в качестве своего первого параметра и анализирует ее в переменной PHP.
Обычно json_decode() возвращает объект stdClass, если элемент верхнего уровня в объекте JSON является словарем или индексированным массивом, если объект JSON является массивом. Он также вернет скалярные значения или NULL для определенных скалярных значений, таких как простые строки, «true» , «false» и «null» . Он также возвращает NULL при любой ошибке.
Используйте var_dump() для просмотра типов и значений каждого свойства объекта, который мы расшифровали выше.
Выход (обратите внимание на типы переменных):
Примечание. Типы переменных в JSON были преобразованы в их эквивалент PHP.
Чтобы вернуть ассоциативный массив для объектов JSON вместо возвращения объекта, передайте true как второй параметр json_decode() .
Вывод (обратите внимание на ассоциативную структуру массива):
Второй параметр ( $assoc ) не действует, если возвращаемая переменная не является объектом.
Примечание. Если вы используете параметр $assoc , вы потеряете различие между пустым массивом и пустым объектом. Это означает, что запуск json_encode() на вашем декодированном выходе снова приведет к другой структуре JSON.
Если строка JSON имеет «глубину» более 512 элементов ( 20 элементов в версиях старше 5.2.3 или 128 в версии 5.2.3 ) в рекурсии, функция json_decode() возвращает NULL . В версиях 5.3 или новее этот предел можно контролировать с помощью третьего параметра ( $depth ), как обсуждается ниже.
PHP реализует надмножество JSON, как указано в оригинале »RFC 4627 — он также кодирует и декодирует скалярные типы и NULL. RFC 4627 поддерживает только эти значения, когда они вложены внутри массива или объекта. Хотя это дополнение соответствует расширенному определению «текста JSON» в новой версии RFC 7159 (целью которого является замещение RFC 4627) и « ECMA-404» , это может вызвать проблемы совместимости со старыми анализаторами JSON, которые строго придерживаются RFC 4627, когда кодируя одно скалярное значение.
Это означает, что, например, простая строка будет считаться допустимым объектом JSON в PHP:
Но простые строки, а не в массиве или объекте, не являются частью стандарта RFC 4627 . В результате такие онлайн-шашки, как JSLint , JSON Formatter & Validator (в режиме RFC 4627) дадут вам ошибку.
Для глубины рекурсии существует третий параметр $depth (значение по умолчанию — 512 ), что означает количество вложенных объектов внутри исходного объекта, подлежащего декодированию.
Существует четвертый параметр $options . В настоящее время он принимает только одно значение: JSON_BIGINT_AS_STRING . Поведение по умолчанию (которое оставляет эту опцию) заключается в том, чтобы отличать целые числа от float вместо строк.
Недействительные варианты с нижним регистром истинных, ложных и нулевых литералов больше не принимаются в качестве допустимого ввода.
Итак, этот пример:
Аналогичное поведение имеет место для false и null .
Обратите внимание, что json_decode() возвращает NULL если строка не может быть преобразована.
Небезопасно полагаться только на возвращаемое значение NULL для обнаружения ошибок. Например, если строка JSON содержит ничего, кроме «null» , json_decode() вернет значение null , даже если ошибка не возникла.
Кодирование строки JSON
Функция json_encode преобразует массив PHP (или, начиная с PHP 5.4, объект, который реализует интерфейс JsonSerializable ) в строку, закодированную в JSON. Он возвращает строку с кодировкой JSON при успешном завершении или FALSE при сбое.
Во время кодирования строки данных типа PHP, integer и boolean преобразуются в эквивалент JSON. Ассоциативные массивы кодируются как объекты JSON, а при вызове с аргументами по умолчанию индексированные массивы кодируются как массивы JSON. (Если ключи массива не являются непрерывной числовой последовательностью, начиная с 0, в этом случае массив будет закодирован как объект JSON.)
аргументы
Начиная с PHP 5.3, второй аргумент json_encode является битовой маской, которая может быть одной или несколькими из следующих.
Как и в любой битовой маске, их можно комбинировать с двоичным оператором OR | ,
JSON_FORCE_OBJECT
Заставляет создать объект вместо массива
JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
Обеспечивает следующие преобразования во время кодирования:
постоянная | вход | Выход |
---|---|---|
JSON_HEX_TAG | u003C | |
JSON_HEX_TAG | > | u003E |
JSON_HEX_AMP | & | u0026 |
JSON_HEX_APOS | ‘ | u0027 |
JSON_HEX_QUOT | « | u0022 |
JSON_NUMERIC_CHECK
Обеспечивает преобразование числовых строк в целые числа.
JSON_PRETTY_PRINT
Делает JSON легко читаемым
JSON_UNESCAPED_SLASHES
Включает неэкранированные / косые черты на выходе
JSON_UNESCAPED_UNICODE
Включает символы с кодировкой UTF8 в выводе вместо u -encoded строк.
JSON_PARTIAL_OUTPUT_ON_ERROR
Позволяет продолжить кодирование, если встречаются некоторые неприменимые значения.
JSON_PRESERVE_ZERO_FRACTION
Обеспечивает, чтобы поплавки всегда кодировались как плавающие.
JSON_UNESCAPED_LINE_TERMINATORS
При использовании с JSON_UNESCAPED_UNICODE возвращается к поведению старых версий PHP и не выходит из символов U + 2028 LINE SEPARATOR и U + 2029 PARAPRAPH SEPARATOR. Хотя они действительны в JSON, эти символы недействительны в JavaScript, поэтому поведение по умолчанию JSON_UNESCAPED_UNICODE было изменено в версии 7.1.
Отладка ошибок JSON
Когда json_encode или json_decode не удается проанализировать предоставленную строку, он вернет false . Сам PHP не вызывает никаких ошибок или предупреждений, когда это происходит, бремя на пользователя заключается в использовании функций json_last_error () и json_last_error_msg (), чтобы проверить, произошла ли ошибка и действовать соответственно в вашем приложении (отладить ее, показать сообщение об ошибке , так далее.).
В следующем примере показана общая ошибка при работе с JSON, неспособность декодировать / кодировать строку JSON (например, из-за передачи плохой кодированной строки UTF-8) .
json_last_error_msg
json_last_error_msg() возвращает человекообразное сообщение о последней ошибке, возникшей при попытке кодирования / декодирования строки.
- Эта функция всегда вернет строку , даже если ошибка не возникла.
Строка по умолчанию без ошибок не No Error - Он вернет false если произошла какая-либо другая (неизвестная) ошибка
- Будьте осторожны при использовании этого в циклах, поскольку json_last_error_msg будет переопределяться на каждой итерации.
Вы должны использовать эту функцию только для получения сообщения для отображения, а не для проверки в контрольных операторах.
Эта функция не существует до PHP 5.5. Вот реализация полиполнения:
json_last_error
json_last_error() возвращает целое число, сопоставленное с одной из предварительно определенных констант, предоставляемых PHP.
постоянная | Имея в виду |
---|---|
JSON_ERROR_NONE | Ошибка не произошла |
JSON_ERROR_DEPTH | Максимальная глубина стека превышена |
JSON_ERROR_STATE_MISMATCH | Недопустимый или некорректный JSON |
JSON_ERROR_CTRL_CHAR | Ошибка контрольного символа, возможно, неправильно закодированная |
JSON_ERROR_SYNTAX | Ошибка синтаксиса (с PHP 5.3.3) |
JSON_ERROR_UTF8 | Малоформатные символы UTF-8, возможно, некорректно закодированные (начиная с PHP 5.5.0) |
JSON_ERROR_RECURSION | Одна или несколько рекурсивных ссылок в кодируемом значении |
JSON_ERROR_INF_OR_NAN | Один или несколько значений NAN или INF в кодируемом значении |
JSON_ERROR_UNSUPPORTED_TYPE | Дано значение типа, который не может быть закодирован. |
Использование JsonSerializable в объекте
Когда вы создаете API REST, вам может потребоваться уменьшить информацию об объекте, который будет передан клиентскому приложению. С этой целью в этом примере показано, как использовать интерфейс JsonSerialiazble .
В этом примере User класса фактически расширяет объект модели DB гипотетической ORM.
Добавьте реализацию JsonSerializable в класс, предоставив метод jsonSerialize() .
Теперь в вашем контроллере приложения или скрипте при передаче объекта User в json_encode() вы получите возвращаемый json-кодированный массив метода jsonSerialize() вместо всего объекта.
пример значений свойств.
Это уменьшит количество данных, возвращаемых конечной точкой RESTful, и позволит исключить свойства объекта из представления json.
Использование частных и защищенных свойств с помощью json_encode()
Чтобы избежать использования JsonSerializable, также можно использовать частные или защищенные свойства, чтобы скрыть информацию о классе из вывода json_encode() . Затем классу не нужно реализовывать JsonSerializable.
Функция json_encode () будет кодировать только общедоступные свойства класса в JSON.
Выход:
Заголовок json и возвращаемый ответ
Добавив заголовок с типом контента как JSON:
Заголовок там, так что ваше приложение может обнаружить, какие данные были возвращены и как он должен справиться с этим.
Обратите внимание: заголовок содержимого представляет собой только информацию о типе возвращаемых данных.
Если вы используете UTF-8, вы можете использовать:
Источник
PHP: json_encode / json_decode error handling.
Unfortunately, the error handling in the earlier versions of PHP is non-existent. It wasn’t until PHP version 5.3.0 that the function json_last_error was introduced that. Before that, json_encode would return a NULL value or a FALSE value and you’d have to use an external JSON validation tool to try and figure out what was going wrong.
For example, if your data had special (non-UTF8) characters, the json_encode function would often return a NULL value. If the depth of your PHP array was too “deep”, then it would return a FALSE value. The json_decode function was also pretty similar in the way that it returned NULL whenever it received malformed / incorrect JSON strings.
Prior to PHP 5.3.0, JSON error handling in PHP looked a little like this (throwing Exceptions):
or, with json_decode:
Thankfully, in PHP 5.3.0, the function json_last_error was introduced. If an error has occurred, it will return one of the following constants:
- JSON_ERROR_NONE: No error has occured.
- JSON_ERROR_DEPTH: Max depth exceeded.
- JSON_ERROR_STATE_MISMATCH: Invalid JSON.
- JSON_ERROR_CTRL_CHAR: Bad character was found.
In PHP 5.3.3, another constant was added:
- JSON_ERROR_UTF8: Bad UTF8 character was found. Incorrect encoding.
Then, in PHP 5.5, they added three more constants:
- JSON_ERROR_RECURSION: Recursion detected.
- JSON_ERROR_INF_OR_NAN: One or more NAN or INF values in the value to be encoded.
- JSON_ERROR_UNSUPPORTED_TYPE: An unsupported type was found.
Using these constants, we can carry out our error handling like so:
Unfortunately, this isn’t the type of code that you should be repeating throughout your script. If you stay true to the DRY (Don’t Repeat Yourself) principle (which you should), then you will wrap this kind of error checking into a function or a class method.
Personally, I would prefer it if json_last_error returned a string-based error message (like the internal XML library does). That way, you wouldn’t need to implement an ugly-looking switch statement.
Still, at least it is far more informative than it used to be!
Источник
Парсинг многоэтажного json?
Есть огромный json:, пытаюсь обработать его через json_decode и получаю:
Т.е., обрабатывает, но не полностью
Как можно получить доступ к оставшемуся куску json?
- Вопрос задан более трёх лет назад
- 3132 просмотра
Оценить 4 комментария
JSON_ERROR_RECURSION One or more recursive references in the value to be encoded
скорее всего проблема в правильности самого json
json_decode пропускает значения, если они были сформированы неправильно (не по описанному стандарту)
Для debug: после json_decode вставить что-то типа:
ну а дальше уже действовать по обстоятельствам 🙂
Я все же сильно сомневаюсь в том что у вас стандартный JSON. Он у вас игнорируется, не парсится. Так что можно предположить вто чнутри json еще один json как строка и его надо парсить отдельно. Ибо если бы была ошибка по глубине json_decode выдал бы null и тогда можно было бы отлавливать это через json_get_error (или как-то так). В документации есть пример как хэндлить такие случаи.
Так же попробуйте сторонние парсеры: https://github.com/Seldaek/jsonlint например. Оно должно нормально разобрать если у вас нормальный json.
Если же у вас слоенка с JSON то нужно вручную рекурсивно обходить полученный массив/объект и пробовать делать json_decode. Если поддается, оставляем. НЕ поддается — оставляем старое значение.
Источник
Для понимания что-же все таки за ошибка и почему выводится NULL
// A valid json string
$json[] = '{"Organization": "PHP Documentation Team"}';
// An invalid json string which will cause an syntax
// error, in this case we used ' instead of " for quotation
$json[] = "{'Organization': 'PHP Documentation Team'}";
foreach ($json as $string) {
echo 'Decoding: ' . $string;
json_decode($string);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
echo PHP_EOL;
}
Ну и несколько вариантов решения:
// если не utf-8
json_decode( preg_replace('/[x00-x1Fx80-xFF]/', '', $json), true );
json_decode(stripslashes($json))
$json = utf8_encode($json);
json_decode($json);
$json = str_replace('"', '"', $json);
json_decode($json);
json_decode(trim($json));
W.c
New Pleskian
-
#1
Hello,
in the current Plesk Obsidian release 18.0.36 I’m getting an error message regarding not started event handlers/malformed JSON when updating a domain via CLI.
For example:
Code:
# plesk bin domain --update domain.tld -perl false
SUCCESS: Update of domain 'domain.tld' completed.
[2021-06-22 09:54:41.465] 84512:60d197410cb9f ERR [panel] Cannot start event handler: Could not decode JSON, syntax error - malformed JSON.
There is an event handler set up for the «Physical hosting updated» event that seems to cause this issue:
Code:
# plesk bin event_handler --list
Id 1
Name Physical hosting updated
Priority 50
User root
Command /usr/local/bin/phys_hosting_update_handler.sh
The phys_hosting_update_handler.sh script simply writes the current date into a file, so there is not much magick going on here:
Code:
#!/bin/bash
/usr/bin/date > /var/www/vhosts/system/${NEW_DOMAIN_NAME}/conf/last_update.txt
Despite the error message the handler script still is executed when updating a domain via CLI (as you can easily see in this case by checking the date in the last_update.txt file). So it doesn’t make much sense why this message appears at all.
Any idea how I can get rid of these «Cannot start event handler» messages?
-
#2
Hello, have same issue with last MU…
[2021-06-23 09:24:40.716] 449:60d2e1b82af17 ERR [panel] Cannot start event handler: Could not decode JSON, syntax error — malformed JSON.
Please plesk team and @IgorG , need an solution.
-
#3
Have you tried to put into Event Command not bash script but target command ‘/usr/bin/date > /var/www/vhosts/system/${NEW_DOMAIN_NAME}/conf/last_update.txt’?
-
#4
Have you tried to put into Event Command not bash script but target command ‘/usr/bin/date > /var/www/vhosts/system/${NEW_DOMAIN_NAME}/conf/last_update.txt’?
@IgorG , we have not try nothing, but these command works without problem since various years and now have an failure since the last MU.
-
#5
@IgorG , we have not try nothing, but these command works without problem since various years and now have an failure since the last MU.
Submit Reports in this case.
Unfortunately, the error handling in the earlier versions of PHP is non-existent. It wasn’t until PHP version 5.3.0 that the function json_last_error was introduced that. Before that, json_encode would return a NULL value or a FALSE value and you’d have to use an external JSON validation tool to try and figure out what was going wrong.
For example, if your data had special (non-UTF8) characters, the json_encode function would often return a NULL value. If the depth of your PHP array was too “deep”, then it would return a FALSE value. The json_decode function was also pretty similar in the way that it returned NULL whenever it received malformed / incorrect JSON strings.
Prior to PHP 5.3.0, JSON error handling in PHP looked a little like this (throwing Exceptions):
$val = json_encode($myArr); if($val === false || is_null($val)){ throw new Exception('Could not encode JSON'); }
or, with json_decode:
$val = json_decode($structure, true); if(!is_array($val)){ throw new Exception('Could not decode JSON'); }
Thankfully, in PHP 5.3.0, the function json_last_error was introduced. If an error has occurred, it will return one of the following constants:
- JSON_ERROR_NONE: No error has occured.
- JSON_ERROR_DEPTH: Max depth exceeded.
- JSON_ERROR_STATE_MISMATCH: Invalid JSON.
- JSON_ERROR_CTRL_CHAR: Bad character was found.
In PHP 5.3.3, another constant was added:
- JSON_ERROR_UTF8: Bad UTF8 character was found. Incorrect encoding.
Then, in PHP 5.5, they added three more constants:
- JSON_ERROR_RECURSION: Recursion detected.
- JSON_ERROR_INF_OR_NAN: One or more NAN or INF values in the value to be encoded.
- JSON_ERROR_UNSUPPORTED_TYPE: An unsupported type was found.
Using these constants, we can carry out our error handling like so:
<?php //Attempt to decode JSON. $decoded = json_decode($arr); //Backwards compatability. if(!function_exists('json_last_error')){ if($decoded === false || $decoded === null){ throw new Exception('Could not decode JSON!'); } } else{ //Get the last JSON error. $jsonError = json_last_error(); //In some cases, this will happen. if(is_null($decoded) && $jsonError == JSON_ERROR_NONE){ throw new Exception('Could not decode JSON!'); } //If an error exists. if($jsonError != JSON_ERROR_NONE){ $error = 'Could not decode JSON! '; //Use a switch statement to figure out the exact error. switch($jsonError){ case JSON_ERROR_DEPTH: $error .= 'Maximum depth exceeded!'; break; case JSON_ERROR_STATE_MISMATCH: $error .= 'Underflow or the modes mismatch!'; break; case JSON_ERROR_CTRL_CHAR: $error .= 'Unexpected control character found'; break; case JSON_ERROR_SYNTAX: $error .= 'Malformed JSON'; break; case JSON_ERROR_UTF8: $error .= 'Malformed UTF-8 characters found!'; break; default: $error .= 'Unknown error!'; break; } throw new Exception($error); } }
Unfortunately, this isn’t the type of code that you should be repeating throughout your script. If you stay true to the DRY (Don’t Repeat Yourself) principle (which you should), then you will wrap this kind of error checking into a function or a class method.
Personally, I would prefer it if json_last_error returned a string-based error message (like the internal XML library does). That way, you wouldn’t need to implement an ugly-looking switch statement.
Still, at least it is far more informative than it used to be!
6 ответов
Вот пара вещей о json_decode
:
- он возвращает данные или
null
, когда есть ошибка - он также может возвращать
null
, когда нет ошибки: когда строка JSON содержитnull
- появляется предупреждение, в котором есть предупреждение — предупреждение о том, что вы хотите исчезнуть.
Для решения проблемы предупреждения было бы использовать оператор @
(я не часто рекомендую его использовать, поскольку он делает отладку намного сложнее… Но здесь не так много выбора):
$_POST = array(
'bad data'
);
$data = @json_decode($_POST);
Затем вам нужно будет проверить, если $data
is null
— и, чтобы избежать случая, когда json_decode
возвращает null
для null
в строке JSON, вы можете проверить json_last_error
, который (цитирование):
Возвращает последнюю ошибку (если она есть) произошел в результате последнего разбора JSON.
Это означает, что вам придется использовать какой-то код, например:
if ($data === null
&& json_last_error() !== JSON_ERROR_NONE) {
echo "incorrect data";
}
Pascal MARTIN
27 фев. 2010, в 17:53
Поделиться
Вы также можете использовать json_last_error: http://php.net/manual/en/function.json-last-error.php
который, как говорится в документации:
Возвращает последнюю ошибку (если она есть) во время последнего JSON кодирование/декодирование.
вот пример
json_decode($string);
switch (json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
Doua Beri
30 июль 2013, в 15:47
Поделиться
Вот как Guzzle обрабатывает json
/**
* Parse the JSON response body and return an array
*
* @return array|string|int|bool|float
* @throws RuntimeException if the response body is not in JSON format
*/
public function json()
{
$data = json_decode((string) $this->body, true);
if (JSON_ERROR_NONE !== json_last_error()) {
throw new RuntimeException('Unable to parse response body into JSON: ' . json_last_error());
}
return $data === null ? array() : $data;
}
Harry Bosh
09 июнь 2017, в 05:36
Поделиться
Я просто сломал себе голову над синтаксической ошибкой json в том, что оказалось совершенным json: {"test1":"car", "test2":"auto"}
из строки с кодировкой url.
Но в моем случае некоторые из вышеперечисленных были закодированы html, так как добавление html_entity_decode($string)
делало трюк.
$ft = json_decode(html_entity_decode(urldecode(filter_input(INPUT_GET, 'ft', FILTER_SANITIZE_STRING))));
Надеюсь, это спасет кого-то еще некоторое время.
Klompenrunner
21 авг. 2016, в 03:17
Поделиться
/**
*
* custom json_decode
* handle json_decode errors
*
* @param type $json_text
* @return type
*/
public static function custom_json_decode($json_text) {
$decoded_array = json_decode($json_text, TRUE);
switch (json_last_error()) {
case JSON_ERROR_NONE:
return array(
"status" => 0,
"value" => $decoded_array
);
case JSON_ERROR_DEPTH:
return array(
"status" => 1,
"value" => 'Maximum stack depth exceeded'
);
case JSON_ERROR_STATE_MISMATCH:
return array(
"status" => 1,
"value" => 'Underflow or the modes mismatch'
);
case JSON_ERROR_CTRL_CHAR:
return array(
"status" => 1,
"value" => 'Unexpected control character found'
);
case JSON_ERROR_SYNTAX:
return array(
"status" => 1,
"value" => 'Syntax error, malformed JSON'
);
case JSON_ERROR_UTF8:
return array(
"status" => 1,
"value" => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
default:
return array(
"status" => 1,
"value" => 'Unknown error'
);
}
}
Zakaria.dem
18 сен. 2016, в 18:27
Поделиться
Начиная с PHP 7.3, функция json_decode будет принимать новую опцию JSON_THROW_ON_ERROR, которая позволит json_decode генерировать исключение вместо возврата null при ошибке.
Пример:
try {
json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (JsonException $exception) {
echo $exception->getMessage(); // displays "Syntax error"
}
dtar
01 май 2019, в 16:24
Поделиться
Ещё вопросы
- 1Заголовки отсутствуют, даже если они явно указаны при чтении файла .ORC с помощью PySpark
- 0Создание каталогов на PHP
- 1Почему постфиксные операторы в Java оцениваются справа налево?
- 0Как сохранить результат процедуры MYSQL, чтобы я мог использовать его в другой процедуре, используя PHP
- 0Как использовать протокол TLS на cURL?
- 1код JavaScript работает только один раз, когда страница загружена
- 0Как разрешить внешний символ
- 1Как остановить скрипт Python — только если он отлаживается
- 1Проблемы с p5.js при отображении альфа-канала
- 1доступ к _id из слушателя событий шаблона в пробелах # цикл
- 1Как добавить массив к каждой предыдущей строке в пандах?
- 1Удалить все поля, начинающиеся с имени «XX»
- 0Заполнить HTML данными JSON
- 0Высота красно-черного дерева с использованием рекурсии
- 0сообщение значение флажка пусто
- 1Как я могу транслировать аудио Alaw?
- 0Почему цикл останавливается?
- 1WPF MVVM: динамическое рисование фигуры из файла xaml
- 1Можете ли вы обновить версию sqlite3 на вашем Android?
- 1Как выйти из JID с помощью библиотеки agsXMPP
- 1Добавление нового настраиваемого поля определенного типа MIME в приложении «Контакты»
- 0Текст руководства не работает, когда текст вводится с помощью другого элемента управления
- 1Включить отключенный Spinner в Android
- 1Android AlphaAnimation, которая только исчезает?
- 0Высота шкалы деления до заданной высоты при изменении размера окна
- 0HTML5 — Холст теряет фокус?
- 1Изображение Java после моего курсора
- 0Отсутствующие библиотеки в CppUnit 1.12.1
- 1Последовательность вызовов методов при создании пользовательских компонентов
- 0Перебор массива arraylist с использованием ng-repeat в angularjs
- 0Панель MFC Workspace
- 1Android Camera Preview вопрос
- 1Как узнать ControlType элемента пользовательского интерфейса из свойства CurrentControlType
- 1Spring 4 websocket и stomp — контроллер не достигнут
- 0Конвертировать сумму в долларах в строку
- 0Пересвязать плагин listnav с помощью AngularJS
- 0Вставка переменных PHP MySQL [дубликаты]
- 1Внедрение реализации интерфейса
- 1При полной потере: отображение простой сущности через Hibernate
- 1Express.js извлечение информации из внешнего API и рендеринг на сайт
- 0затронутые строки в postgres с CodeIgniter
- 0Угловой JS с ASP.NET Master Pages
- 1Подписка на шаблон Meteor JS: невозможно запросить данные с помощью find () даже после Template.instance (). SubscriptionReady ()
- 0Как сделать цикл внутри скрипта JQuery?
- 0Установить структуру каталогов для всех проектов в решении Visual Studio?
- 0Суммирование умножения двух падежных выражений
- 1Рисуем картинку в андроид
- 1TypeError C — неопределенные таблицы данных
- 1Альтернативная запись в Play Store
- 0Тайм-аут транспортира из-за $ timeout и $ interval
Я пытаюсь передать массив из моего файла ветки на другой контроллер с помощью Ajax.
Мой код Ajax:
$(window).scroll(function () {
if($(window).scrollTop() + $(window).height()>= $(document).height()){
getmoredata();
}
})
var page = 1;
function getmoredata(array_data_file) {
var array_data_file = { {{ announces }} } ;
var theurl = '{{ path('announce_page', {'id': "id", 'game': game}) }}';
theurl = theurl.replace("id", page);
$.ajax({
type: "GET",
data: {data_array:array_data_file},
url: theurl,
dataType: "json",
cache: false,
success: function (response) {
$("#content").append(response.classifiedList);
page = page + 1;
$('#spinner').hide();
console.log(response);
},
error: function (response) {
console.log(response);
}
});
}
</script>
Код контроллера:
public function pageAction(Request $request, $id, $game)
{
$em = $this->getDoctrine()->getManager();
//$announces = $em->getRepository('PlatformBundle:Announce')->byGame($game);
$announces = $request->request->get('data_array');
$list = $this->renderView('announce/result.html.twig', array(
'announces' => $announces,
'game' => $game
));
$response = new JsonResponse();
$response->setData(array('classifiedList' => $list));
return $response;
}
Две проблемы с моим кодом:
Во-первых, это получение переменной javascript с объявлением моей сущности, в котором много всего.
var array_data_file = { {{ announces }} } ;
Это не работает, поэтому я пытаюсь что-то подобное
var array_data_file ={{ announces|json_encode() }};
Но когда я делаю предупреждение (array_data_file);
Я получил что-то подобное:
объект Object], [объект Object], [объект Object], [объект Object], [объект
Объект], [Объект Объект], [Объект Объект], [Объект Объект], [Объект
Объект], [Объект Объект], [Объект Объект], [Объект Объект]
Во-вторых, я всегда получаю переменную NULL от моего контроллера
$announces = $request->request->get('data_array');
Этот код для бесконечной системы прокрутки для размещения бесконечного объявления на моей странице. Я хотел бы передать свое объявление со своей индексной страницы, чтобы я не проводил новые исследования в базе данных, например:
$announces = $em->getRepository('PlatformBundle:Announce')->byUser($user);
Любое решение для этого?
Спасибо всем
РЕДАКТИРОВАТЬ:
Я почти закончил, чтобы решить мою проблему.
Я установил
и теперь я могу использовать эту команду, чтобы иметь переменный формат с JSON.
var contactsArray = "{{ announces|serialize('json') }}";
Теперь моя переменная содержит очень длинную строку.
Я изменил тип «GET» на «POST», потому что мой URL был слишком длинным.
Теперь вернемся к моему контроллеру, я беру из POST мою переменную
$data = $request->request->get('data_array');
Но это все еще очень длинная строка, и я пытаюсь вернуться к своей сущности с этим:
$serializer = $this->container->get('jms_serializer');
$announces = $serializer->deserialize($data, 'WolkPlatformBundleEntityAnnounce', 'json');
но у меня такая ошибка
"Could not decode JSON, syntax error - malformed JSON."
Дело в том, что я прочитал какой-то пост, и они сказали вставить в каждую переменную моих сущностей
- @JMS Serializer аннотаций Тип ( «Строка»)
Но это слишком долго, у меня есть много переменных и сущностей из моего объявления x /
А вот и я
0
Решение
Задача ещё не решена.
Другие решения
Других решений пока нет …
(PHP 5 >= 5.3.0, PHP 7, PHP
json_last_error — Returns the last error occurred
Description
json_last_error(): int
Parameters
This function has no parameters.
Return Values
Returns an integer, the value can be one of the following
constants:
Constant | Meaning | Availability |
---|---|---|
JSON_ERROR_NONE |
No error has occurred | |
JSON_ERROR_DEPTH |
The maximum stack depth has been exceeded | |
JSON_ERROR_STATE_MISMATCH |
Invalid or malformed JSON | |
JSON_ERROR_CTRL_CHAR |
Control character error, possibly incorrectly encoded | |
JSON_ERROR_SYNTAX |
Syntax error | |
JSON_ERROR_UTF8 |
Malformed UTF-8 characters, possibly incorrectly encoded | |
JSON_ERROR_RECURSION |
One or more recursive references in the value to be encoded | |
JSON_ERROR_INF_OR_NAN |
One or moreNAN or INF values in the value to be encoded |
|
JSON_ERROR_UNSUPPORTED_TYPE |
A value of a type that cannot be encoded was given | |
JSON_ERROR_INVALID_PROPERTY_NAME |
A property name that cannot be encoded was given | |
JSON_ERROR_UTF16 |
Malformed UTF-16 characters, possibly incorrectly encoded |
Examples
Example #1 json_last_error() example
<?php
// A valid json string
$json[] = '{"Organization": "PHP Documentation Team"}';// An invalid json string which will cause an syntax
// error, in this case we used ' instead of " for quotation
$json[] = "{'Organization': 'PHP Documentation Team'}";
foreach (
$json as $string) {
echo 'Decoding: ' . $string;
json_decode($string);
switch (
json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
echo
PHP_EOL;
}
?>
The above example will output:
Decoding: {"Organization": "PHP Documentation Team"} - No errors Decoding: {'Organization': 'PHP Documentation Team'} - Syntax error, malformed JSON
Example #2 json_last_error() with json_encode()
<?php
// An invalid UTF8 sequence
$text = "xB1x31";$json = json_encode($text);
$error = json_last_error();var_dump($json, $error === JSON_ERROR_UTF8);
?>
The above example will output:
string(4) "null" bool(true)
Example #3 json_last_error() and JSON_THROW_ON_ERROR
<?php
// An invalid UTF8 sequence which causes JSON_ERROR_UTF8
json_encode("xB1x31");// The following does not cause a JSON error
json_encode('okay', JSON_THROW_ON_ERROR);// The global error state has not been changed by the former json_encode()
var_dump(json_last_error() === JSON_ERROR_UTF8);
?>
The above example will output:
See Also
- json_last_error_msg() — Returns the error string of the last json_encode() or json_decode() call
- json_decode() — Decodes a JSON string
- json_encode() — Returns the JSON representation of a value
jimmetry at gmail dot com ¶
11 years ago
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.
praveenscience at gmail dot com ¶
8 years ago
I used this simple script, flicked from StackOverflow to escape from the function failing:
<?php
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $v) {
$d[$k] = utf8ize($v);
}
} else if (is_string ($d)) {
return utf8_encode($d);
}
return $d;
}
?>
Cheers,
Praveen Kumar!
msxcms at bmforum dot com ¶
5 years ago
use this code with mb_convert_encoding, you can json_encode some corrupt UTF-8 chars
function safe_json_encode($value, $options = 0, $depth = 512) {
$encoded = json_encode($value, $options, $depth);
if ($encoded === false && $value && json_last_error() == JSON_ERROR_UTF8) {
$encoded = json_encode(utf8ize($value), $options, $depth);
}
return $encoded;
}
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;
}
hemono at gmail dot com ¶
7 years ago
when json_decode a empty string, PHP7 will trigger an Syntax error:
<?php
json_decode("");
var_dump(json_last_error(), json_last_error_msg());// PHP 7
int(4)
string(12) "Syntax error"// PHP 5
int(0)
string(8) "No error"
George Dimitriadis ¶
6 years ago
Just adding this note since I had to code this for the actual values reference.
<?phpecho JSON_ERROR_NONE . ' JSON_ERROR_NONE' . '<br />';
echo JSON_ERROR_DEPTH . ' JSON_ERROR_DEPTH' . '<br />';
echo JSON_ERROR_STATE_MISMATCH . ' JSON_ERROR_STATE_MISMATCH' . '<br />';
echo JSON_ERROR_CTRL_CHAR . ' JSON_ERROR_CTRL_CHAR' . '<br />';
echo JSON_ERROR_SYNTAX . ' JSON_ERROR_SYNTAX' . '<br />';
echo JSON_ERROR_UTF8 . ' JSON_ERROR_UTF8' . '<br />';
echo JSON_ERROR_RECURSION . ' JSON_ERROR_RECURSION' . '<br />';
echo JSON_ERROR_INF_OR_NAN . ' JSON_ERROR_INF_OR_NAN' . '<br />';
echo JSON_ERROR_UNSUPPORTED_TYPE . ' JSON_ERROR_UNSUPPORTED_TYPE' . '<br />';/*
The above outputs :
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
6 JSON_ERROR_RECURSION
7 JSON_ERROR_INF_OR_NAN
8 JSON_ERROR_UNSUPPORTED_TYPE
*/?>
wedge at atlanteans dot net ¶
4 years ago
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.
<?php
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $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;
}
?>
williamprogphp at yahoo dot com dot br ¶
9 years ago
This is a quite simple and functional trick to validate JSON's strings.
<?phpfunction json_validate($string) {
if (is_string($string)) {
@json_decode($string);
return (json_last_error() === JSON_ERROR_NONE);
}
return false;
}
echo (json_validate('{"test": "valid JSON"}') ? "It's a JSON" : "NOT is a JSON"); // prints 'It's a JSON'
echo (json_validate('{test: valid JSON}') ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to missing quotes
echo (json_validate(array()) ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to a non-string argument
?>
Cheers