Could not decode json syntax error malformed json

Solved! ← php - Could not decode JSON, syntax error - malformed JSON
  1. Home

  2. 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.

Содержание

  1. PHP JSON
  2. Вступление
  3. Синтаксис
  4. параметры
  5. замечания
  6. Декодирование строки JSON
  7. Кодирование строки JSON
  8. аргументы
  9. JSON_FORCE_OBJECT
  10. JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
  11. JSON_NUMERIC_CHECK
  12. JSON_PRETTY_PRINT
  13. JSON_UNESCAPED_SLASHES
  14. JSON_UNESCAPED_UNICODE
  15. JSON_PARTIAL_OUTPUT_ON_ERROR
  16. JSON_PRESERVE_ZERO_FRACTION
  17. JSON_UNESCAPED_LINE_TERMINATORS
  18. Отладка ошибок JSON
  19. json_last_error_msg
  20. json_last_error
  21. Использование JsonSerializable в объекте
  22. пример значений свойств.
  23. Использование частных и защищенных свойств с помощью json_encode()
  24. Выход:
  25. Заголовок json и возвращаемый ответ
  26. PHP: json_encode / json_decode error handling.
  27. Парсинг многоэтажного 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.

IgorG


  • #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.

IgorG


  • #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 8)

json_last_errorReturns 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:

JSON error codes

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 more
NAN
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


Понравилась статья? Поделить с друзьями:
  • Could not create d3d12 device 887a0004 как исправить
  • Could not create d3d11 device как исправить
  • Could not install the app on the device read the error above for details
  • Could not convert variant of type error into type string
  • Could not initialize steam ошибка