Мне нужен действительно очень быстрый способ проверки, является ли строка JSON или нет. Я чувствую, что это не лучший способ
function isJson($string) {
return ((is_string($string) &&
(is_object(json_decode($string)) ||
is_array(json_decode($string))))) ? true : false;
}
Любые энтузиасты производительности хотят улучшить этот метод?
php
json
error-handling
json-deserialization
jsonresult
Кирк Уймет
источник
источник
json_decode
один раз ... также проверьте входные и возвращаемые значенияjson_decode
.Ответы:
источник
{
,[
или первого символа любого другого литерала потенциально может значительно ускорить эту вверх , когда многие из входящих строк , как ожидается , будут не-JSON.6.5 = true, '300' = true, 9 = true
и т. д. Таким образом, это может быть допустимым значением JSON, но функция может работать не так, как вы ожидаете, если вы хотите проверять только допустимые строки JSON с помощью{}
или[]
;Функция
json_last_error
возвращает последнюю ошибку, возникшую во время кодирования и декодирования JSON. Таким образом, самый быстрый способ проверить действующий JSONОбратите внимание, что
json_last_error
поддерживается только в PHP> = 5.3.0.Всегда полезно знать точную ошибку во время разработки. Вот полная программа для проверки точных ошибок на основе PHP документов.
Поскольку
json_last_error
в PHP 5.2 не поддерживается, вы можете проверить, возвращает ли кодировка или декодирование логическое значениеFALSE
. Вот примерНадеюсь, это полезно. Удачного кодирования!
источник
((strlen($json) === 5) && ($json !== 'false'))
следует также проверить, чтобы избежать этого края?json_last_error
возвращаетсяJSON_ERROR_NONE
.Все, что вам действительно нужно сделать, это ...
Этот запрос не требует отдельной функции даже. Просто оберните is_object вокруг json_decode и двигайтесь дальше. Кажется, что это решение заставляет людей слишком много думать об этом.
источник
is_array
в дополнение кis_object
, иначеis_object
будет возвращать false для простых массивов, закодированных в виде JSON. Так что @ggutenberg прав в этом случае. Передача истинного аргументаjson_decode
принудительно возвращает объект в виде массива. Теоретически вы всегда можете принудительно декодировать массив и просто проверитьis_array
, что должно работать.json_encode($array)
для простого массива PHP, а затемjson_decode($str)
я получу объект, но не массив.json_decode($str, true)
заставляет конвертировать в массив. Почему сложная строка в вашем коде? Проверьтеis_array(json_decode($str, true))
и через некоторое время, прочитав его, вы поймете, что декодированный должен быть только массив. Гораздо сложнее догадатьсяis_object(json_decode($MyJSONArray))
"О, вот я проверяю, является ли декодированный массив или нет?"json_decode
вернуть массив , чтобы сохранить вас для проверки объекта и массива, но если вы этого не сделаете и вы ,json_decode
что для начала, это был простой массив, в ответ вы получите массив при декодировании, а не объект. Вы должны использовать,JSON_FORCE_OBJECT
если вы хотите всегда принудительно вызывать объект для кодирования IF, передавая простой массив.This request does not require a separate function even
. Строго говоря, ни одно решение не требует отдельной функции. Смысл функции не в том, чтобы несколько строк кода выглядели как одна строка кода. Смысл этой функции заключается в том, чтобы сделать процесс проверки JSON стандартом повсюду в вашем приложении, чтобы разные программисты (или один и тот же программист с течением времени) не использовали разные процедуры проверки на разных этапах выполнения программы.Использование
json_decode
«зондирования» может быть не самым быстрым способом. Если это глубоко вложенная структура, то создание множества объектов массивов для их просто выброса - пустая трата памяти и времени.Так что это может быть быстрее в использовании
preg_match
и регулярное выражение RFC4627 для обеспечения правильности :То же самое в PHP:
Однако здесь недостаточно энтузиаста производительности, чтобы беспокоиться о тестах.
источник
json_decode
всегда быстрее, чем регулярное выражение PCRE. (Хотя он не очень оптимизирован, синтетические тесты не найдены и могут вести себя по-другому в Perl ..)\r
\n
\t
это имеет смысл только поэтому PHP не интерполировать их, но пусть PCRE интерпретировать их (только требуется для/x
режима). Другие случаи не нуждаются в этом строго; и все же «обратная косая черта избегает себя» во всех строковых контекстах PHP. Так что можно считать это более точным.Это вернет true, если ваша строка представляет массив или объект json :
Он отклоняет строки json, которые содержат только число, строку или логическое значение, хотя эти строки являются технически допустимыми json.
Это самый короткий путь, который я могу придумать.
источник
var_dump(isJson('[]')); // bool(false)
. Согласно документации по логическим значениям, это происходит потому, что PHP оценивает массивы с нулевыми элементами как ложные. Вот небольшая поправка для корректировки заявления о возврате; он выполняет идентичное сравнение с декодированным выводом, который обрабатывает этот случай:return $json !== false && $str != $json;
isJson('hello')
как истинное, что недопустимо для json. Свободное сравнение выбрано здесь специально. У меня нет быстрого решения для ситуации с пустым массивом / объектом, кроме уродливогоreturn $json == '[]' || ...
Самый простой и быстрый способ, которым я пользуюсь, заключается в следующем;
Это связано с тем, что json_decode () возвращает NULL, если введенная строка не является json или недействительной json.
Простая функция для проверки JSON
Если вам нужно проверить свой JSON в нескольких местах, вы всегда можете использовать следующую функцию.
В приведенной выше функции вы получите true в ответ, если это правильный JSON.
источник
json_decode('null') == NULL
иnull
является допустимым значением JSON.JSON.parse('null')
в вашей консоли разработчика.http://tr.php.net/manual/en/function.json-decode.php Возвращаемое значение равно нулю при обнаружении неверной кодировки.
источник
json_decode($str)!=null;
или иначе функция должна быть вызванаis_not_json
.json_decode('null')
является допустимым JSON в соответствии со спецификацией и должен возвращать значениеnull
.is_json('false')
иis_json('[]')
будет возвращаться, такfalse
как тип не проверяется. Я думаю, что этот метод должен скорее вернуться$str === null || json_decode($str) !== null
.Вы должны проверить введенные данные, чтобы убедиться, что передаваемая строка не пуста и фактически является строкой. Пустая строка не является допустимой JSON.
Я думаю , что в PHP это более важно , чтобы определить , является ли объект JSON даже есть данные, так как использовать эти данные вам необходимо позвонить
json_encode()
илиjson_decode()
. Я предлагаю запретить пустые объекты JSON, чтобы вы не выполняли ненужное кодирование и декодирование пустых данных.источник
'0'
не действует JSON ... с чего бы мне быть осторожнее? @KzqaiЭто сделает это:
Как показано в других ответах,
json_last_error()
возвращает любую ошибку из нашего последнего json_decode (). Однако есть некоторые крайние случаи использования, когда одна эта функция не является достаточно полной. Например, если выjson_decode()
целое число (например:)123
, или строка чисел без пробелов или других символов (например:)"123"
,json_last_error()
функция не будет ловить ошибку.Чтобы бороться с этим, я добавил дополнительный шаг, который гарантирует, что результатом нашего
json_decode()
будет либо объект, либо массив. Если это не так, то мы вернемсяfalse
.Чтобы увидеть это в действии, проверьте эти два примера:
json_last_error()
источник
"hello"
является допустимым JSON, и он не является ни объектом, ни массивом,json_last_error()
достаточноjson_last_error()
возвращает код ошибки,4
когда выjson_decode()
строку"hello"
. Пример здесь: 3v4l.org/lSsEohello
не является допустимым JSON, но"hello"
является 3v4l.org/OEJrQПростой способ - проверить результат json.
источник
в GuzzleHttp :
источник
Ранее я просто проверял нулевое значение, что на самом деле было неправильно.
Приведенный выше фрагмент кода отлично работает со строками. Однако, как только я предоставлю номер, он сломается. Например.
Исправить то, что я сделал, было очень просто.
источник
источник
Еще один простой способ
источник
json_decode($str,true)
позволяет преобразовывать объекты в массивы, чтобы он прошел проверку is_array. Вы исправляете строки, целые числа и т. Д.Нам нужно проверить, не является ли переданная строка не числовой, потому что в этом случае json_decode не вызывает ошибок.
источник
Я нашел этот вопрос после того, как столкнулся с чем-то похожим в моей работе вчера. Мое решение в итоге было гибридом некоторых из подходов выше:
источник
Я пробовал некоторые из этих решений, но у меня ничего не получалось. Я пробую эту простую вещь:
Я думаю, что это хорошее решение, так как декодирование JSON без второго параметра дает объект.
РЕДАКТИРОВАТЬ: Если вы знаете, что будет вход, вы можете адаптировать этот код для ваших нужд. В моем случае я знаю, что у меня есть Json, начинающийся с "{", поэтому мне не нужно проверять, является ли он массивом.
источник
Используя PHPBench со следующим классом, были достигнуты следующие результаты:
Вывод: самый быстрый способ проверить, действителен ли json, - это вернуться
json_decode($json, true) !== null)
.источник
Я не знаю о производительности или элегантности моего решения, но это то, что я использую:
Поскольку все мои строки в кодировке JSON начинаются с {", достаточно проверить это с помощью RegEx. Я не очень хорошо разбираюсь в RegEx, поэтому может быть лучший способ сделать это. Также: strpos () может быть быстрее.
Просто пытаюсь отдать в мою цену.
PS Просто обновил строку RegEx,
/^[\[\{]\"/
чтобы также найти строки массива JSON. Так что теперь он ищет либо [", либо {" в начале строки.источник
Должно быть что-то вроде этого:
Модульный тест
источник
ErrorException
если строка является массивом или объектом.Расширяя этот ответ Как насчет следующего:
источник
Привет, вот небольшой фрагмент из моей библиотеки, в этом первом условии я просто проверяю, являются ли данные json, затем возвращает их, если они правильно декодированы, пожалуйста, обратите внимание на использование substr для производительности (я еще не видел ни одного файла json, не начинающего {или [
источник
Еще одно предложение от меня :)
источник
Пользовательская функция
случаи
Ресурсы
https://gist.github.com/rafasashi/93d06bae83cc1a1f440b
источник
Недавно сделанная функция для совместимости с PHP 5.2, если вам нужны декодированные данные в случае успеха:
Применение:
Некоторые тесты:
источник
источник
Простая модификация ответа Генрика, чтобы коснуться наиболее необходимых возможностей.
(включая "{} и []")
источник
Самый быстрый способ, возможно, декодировать возможный объект JSON в объект / массив PHP:
источник
Вот эффективная и простая функция, которую я создал (которая использует базовую проверку строк перед использованием
json_decode
для больших строк):источник