У меня простой вызов AJAX, и сервер вернет либо строку JSON с полезными данными, либо строку сообщения об ошибке, созданную функцией PHP mysql_error()
. Как я могу проверить, являются ли эти данные строкой JSON или сообщением об ошибке.
Было бы неплохо использовать функцию, вызываемую так isJSON
же, как вы можете использовать функцию instanceof
для проверки, является ли что-либо массивом.
Это то, что я хочу:
if (isJSON(data)){
//do some data stuff
}else{
//report the error
alert(data);
}
javascript
mysql
json
jeffery_the_wind
источник
источник
eval()
если он возвращаетundefined
тогда, это не JSONОтветы:
Используйте JSON.parse
источник
JSON.parse(1234)
ИЛИJSON.parse(0)
ИЛИJSON.parse(false)
ИЛИJSON.parse(null)
все не вызовет Exception и вернет true !! Не используйте этот ответ1234
,0
,false
иnull
все действительные значения JSON. Если вы хотите предикат, который проверяет, представляет ли JSON объект, вам нужно сделать немного больше.JSON.parse
выполняет много вычислений для анализа строки и выдачи вам объекта json в случае успеха, но вы отбрасываете результат, который некоторые пользователи могут захотеть использовать. Это не кажется хорошим. Я бы вместо этогоreturn {value: JSON.parse(str), valid: true};
и в блоке catchreturn {value: str, valid: false};
.. и я бы изменил имя функции наtryParse()
.Этот код
JSON.parse(1234)
илиJSON.parse(0)
илиJSON.parse(false)
илиJSON.parse(null)
все вернет true.Поэтому я переписал код следующим образом:
Результат тестирования:
Результаты теста isJson
источник
return (typeof suspect === "object" && suspect !== null);
Давайте повторим это (для 2019+).
ФАКТ : Эти примитивные значения являются JSON-разборными, но они не являются правильно сформированными структурами JSON . Спецификация JSON указывает, что JSON построен на двух структурах: совокупности пары имя / значение (объект) или упорядоченном списке значений (массив).
ФАКТ : нет! Определенно законно использовать try / catch, особенно в таком случае. В противном случае вам нужно будет выполнить множество операций анализа строк, таких как операции токенизации / регулярного выражения; который имел бы ужасную производительность.
hasJsonStructure()
Это полезно, если ваша цель состоит в том, чтобы проверить, имеют ли некоторые данные / текст правильный формат обмена JSON.
Использование:
safeJsonParse()
И это полезно, если вы хотите быть осторожным при разборе некоторых данных на значение JavaScript.
Использование:
источник
Если сервер отвечает JSON, он будет иметь
application/json
тип контента, если он отвечает простым текстовым сообщением, то он должен иметьtext/plain
тип контента. Убедитесь, что сервер отвечает с правильным типом содержимого и проверьте это.источник
overrideMimeType
может переопределить заголовок типа содержимого.если при использовании
jQuery $.ajax()
ответа будетresponseJSON
свойство, если ответ был JSON, это можно проверить следующим образом:источник
Мне нравится лучший ответ, но если это пустая строка, она возвращает true. Итак, вот исправление:
источник
Однако я предлагаю вам, чтобы ваш http-вызов / служба всегда возвращал данные в одном и том же формате. Так что, если у вас есть ошибка, у вас должен быть объект JSON, который обернет эту ошибку:
И, возможно, использовать как HTTP-статус 5xx код.
источник
Ну ... Это зависит от того, как вы получаете ваши данные. Я думаю, что сервер отвечает форматированной строкой JSON (например, с помощью json_encode () в PHP). Если вы используете публикацию JQuery и задаете данные ответов в формате JSON, а это искаженный JSON, это приведет к ошибке:
Но если вы используете тип ответа как текст, вам нужно использовать $ .parseJSON. Согласно сайту jquery: «Передача искаженной строки JSON может привести к возникновению исключения». Таким образом, ваш код будет:
источник
response
он пуст, он пойдет наsuccess
: '(Вероятно, есть тесты, которые вы можете выполнить, например, если вы знаете, что возвращаемый JSON всегда будет окружен,
{
а}
затем вы можете проверить эти символы или какой-нибудь другой хакерский метод. Или вы можете использовать JS-библиотеку json.org, чтобы попытаться проанализировать ее и проверить, успешно ли она работает.Однако я бы предложил другой подход. Ваш PHP-скрипт в настоящее время возвращает JSON, если вызов успешен, но что-то еще, если это не так. Почему не всегда возвращать JSON?
Например
Успешный звонок:
Ошибочный вызов:
Это значительно упростит написание JS на стороне клиента - все, что вам нужно сделать, это проверить элемент «status» и действовать соответственно.
источник
Я использую только 2 строки, чтобы выполнить это:
Вот и все!
Но имейте в виду, что есть 2 ловушки:
1.
JSON.parse(null)
возвратnull
2. Любое число или строка могут быть проанализированы с помощью
JSON.parse()
метода.JSON.parse("5")
возвращается5
JSON.parse(5)
возвращается5
Давайте немного поиграем с кодом:
источник
[
и]
. Например,[1, 2, 3]
это массив чисел.["a", "b", "c"]
это массив строк И[{"a":1}, {"b":2}]
это массив JSON. Ваша работа с jsfiddle кажется действительно полезной!JSON.parse
. Кто-нибудь может посоветовать, как избежать этой ошибки без использования try?jsfiddle
приложение выдает ошибку, потому что в Test 3 нет допустимого выражения JSON. Таким образом, atry-catch
нужно использовать, чтобы перехватить эту ошибку и оценить любую ошибку, так как выражение не является JSON при синтаксическом анализе, как в тесте 3 выше:try { JSON.parse(data3) } catch(e) { isValidJSON = false }
Вы можете попробовать расшифровать его и поймать исключение (native или json2.js ):
Тем не менее, я бы предложил сделать ответ всегда действительным JSON. Если вы получили ошибку из запроса MySQL, просто отправьте обратно JSON с ошибкой:
А потом:
источник
Предупреждение: для методов, полагающихся на
JSON.parse
- массивы и заключенные в кавычки строки тоже пройдут (т.е.console.log(JSON.parse('[3]'), JSON.parse('"\uD800"'))
)Чтобы избежать всех необъектных JSON-примитивов (логических, нулевых, массивов, чисел, строк), я предлагаю использовать следующее:
Код Объяснение
Почему бы не использовать ответ hasJsonStructure ()?
Полагаться на
toString()
это не очень хорошая идея. Это потому, что разные движки JavaScript могут возвращать разные строковые представления. В общем, методы, которые полагаются на это, могут потерпеть неудачу в разных средах или могут стать причиной сбоя позже, если механизм когда-либо изменит строковый результатПочему поймать исключение не взломать?
Было высказано мнение, что поймать исключение для определения достоверности чего-либо никогда нельзя. Это вообще хороший совет, но не всегда. В этом случае перехват исключений, вероятно, является наилучшим маршрутом, поскольку он основан на реализации механизма проверки данных JSON в движке JavaScript.
Опора на движок JS предлагает следующие преимущества:
Когда мне дали возможность опереться на движок JavaScript, я бы предложил сделать это. Особенно в этом случае. Хотя может показаться хакерским поймать исключение, на самом деле вы просто обрабатываете два возможных состояния возврата из внешнего метода.
источник
Вот код с некоторыми незначительными изменениями в ответе Борна. Поскольку JSON.parse (число) работает нормально без каких-либо исключений, поэтому добавлен isNaN.
источник
Все строки json начинаются с '{' или '[' и заканчиваются соответствующими '}' или ']', поэтому просто проверьте это.
Вот как это делает Angular.js:
https://github.com/angular/angular.js/blob/v1.6.x/src/ng/http.js
источник
{ someValue }
, автоматически пройдет проверку.Я предлагаю в режиме Typescript:
источник
Я использовал этот (вид смеси разных ответов, но в любом случае):
источник
Вы можете попробовать следующий, потому что он также проверяет число, ноль, строку, но отмеченный выше ответ не работает правильно, это просто исправление вышеуказанной функции:
источник
В дополнение к предыдущим ответам, в случае, если вам нужно проверить формат JSON, такой как "{}", вы можете использовать следующий код:
Примеры использования: