Как я могу проверить, является ли значение объектом json?
102
Мой серверный код возвращает значение, которое является объектом json в случае успеха и строкой false в случае ошибки. Как теперь проверить, является ли возвращаемое значение объектом json?
Если это на самом деле «ваш» код на стороне сервера, почему бы не иметь поле статуса в результате JSON, а не создавать эту ситуацию «иногда-это-JSON-а-иногда-это-нет» ...?
HostileFork говорит, что не доверяйте SE
@Hostile Для отладки. Вы никогда не сможете понять, какой сбой выдаст сервер, и в этот момент json не используется.
Барт
1
Я до сих пор не понимаю, как наличие кода ошибки (в виде именованного поля) в ответе сервера может подорвать это. Для Freebase этого достаточно! wiki.freebase.com/wiki/MQL_errors
HostileFork говорит, что не доверяйте SE
Пожалуйста, измените принятый ответ на ответ Сергея Федорова, если можете, принятый в настоящее время ответ неверен.
Серж Саган
Что такое «объект json»? Есть строки JSON и объекты JS, но нет такой вещи, как «объект нотации объектов JavaScript».
mpen
Ответы:
107
jQuery.parseJSON () должен возвращать объект типа «объект», если строка была JSON, поэтому вам нужно только проверить тип с помощью typeof
var response=jQuery.parseJSON('response from server');if(typeof response =='object'){// It is JSON}else{if(response ===false){// the response was a string "false", parseJSON will convert it to boolean false}else{// the response was something else}}
Возможно, также потребуется использовать try / catch для исключений, если возможно, что parseJSON будет иметь дело с чем-то другим, кроме значений JSON (например, HTML)
acorncom
2
До jQuery 1.9 $ .parseJSON возвращал null вместо того, чтобы выдавать ошибку, если ему была передана пустая строка, null или undefined, даже если они не являются допустимым JSON. Ссылка на сайт jquery
gloomy.penguin
7
Это решение не самое лучшее, т.к. возвращает "SyntaxError: JSON.parse: unexpected character"ошибку! , Я думаю, что лучшим решением является использование метода try / catch, о котором говорится Serguei Fedorovздесь: stackoverflow.com/questions/4295386/…
Nabi KAZ
2
Если вы не хотите использовать jquery, вы можете использовать vanilla JS, проверив тип конструктора, как описано здесь: stackoverflow.com/questions/11182924/…
Mat
2
Этот ответ неверен, ответ Сергея Федорова должен быть принятым ответом.
ошибка в Chrome. Это потому, что ошибка выдается, как только при синтаксическом анализе встречается неизвестный символ. Однако есть способ обойти это, если вы возвращаете только строковые значения через ajax (что может быть довольно полезно, если вы используете PHP или ASPX для обработки запросов ajax и можете или не можете возвращать JSON в зависимости от условий)
Решение довольно простое, вы можете сделать следующее, чтобы проверить, был ли это действительный возврат JSON.
var IS_JSON =true;try{var json = $.parseJSON(msg);}catch(err){
IS_JSON =false;}
Как я уже сказал, это решение, если вы либо возвращаете материал строкового типа из вашего запроса AJAX, либо если вы возвращаете смешанный тип.
Речь идет не о строках, отличных от JSON. Сервер всегда возвращает действительный JSON (строка falseтакже является допустимым JSON). Вопрос только в одном: как false
различить,
2
Оценка производительности: заключая это в функцию, убедитесь, что не анализируете json дважды (один раз внутри try catch и один раз в коде, вызывающем функцию.)
Michiel Cornille
Это помощники действуют isJSON () , которые вы можете использовать: isJSON(someValue).
Если вы используете JQuery для передачи информации через AJAX. Я рекомендую вам указать в атрибуте «dataType» значение «json», таким образом, если вы получите JSON или нет, JQuery проверит его за вас и сделает это известным через свои функции «успех» и «ошибка». Пример:
$.ajax({
url:'http://www.something.com',
data: $('#formId').serialize(),
method:'POST',
dataType:'json',// "sucess" will be executed only if the response status is 200 and get a JSON
success:function(json){},// "error" will run but receive state 200, but if you miss the JSON syntax
error:function(xhr){}});
Если вы используете isPlainObject в строке, он вернет false, например jQuery.isPlainObject ('{}')
Рой Шоа,
Что еще более важно, если оно содержит в качестве свойства значение, отличное от JSON, согласно документации, эта функция все равно будет возвращать true.
samvv 05
6
var checkJSON =function(m){if(typeof m =='object'){try{ m = JSON.stringify(m);}catch(err){returnfalse;}}if(typeof m =='string'){try{ m = JSON.parse(m);}catch(err){returnfalse;}}if(typeof m !='object'){returnfalse;}returntrue;};
checkJSON(JSON.parse('{}'));//true
checkJSON(JSON.parse('{"a":0}'));//true
checkJSON('{}');//true
checkJSON('{"a":0}');//true
checkJSON('x');//false
checkJSON('');//false
checkJSON();//false
Я знаю, что на эту ветку уже ответили, но приход сюда на самом деле не решил мои проблемы, я нашел эту функцию где-то еще. может быть, кто-то, придя сюда, найдет в нем какую-то пользу;
function getClass(obj){if(typeof obj ==="undefined")return"undefined";if(obj ===null)return"null";returnObject.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];}
Если вы хотите явно протестировать действительный JSON (в отличие от отсутствия возвращаемого значения false), вы можете использовать подход синтаксического анализа, как описано здесь .
Мне не очень нравится принятый ответ. В первую очередь для этого требуется jQuery, который не всегда доступен или необходим. Во-вторых, он выполняет полную структуризацию объекта, что для меня является излишним. Вот простая функция, которая тщательно определяет, является ли значение JSON-подобным, используя не что иное, как несколько частей библиотеки lodash для универсальности.
Ответы:
jQuery.parseJSON () должен возвращать объект типа «объект», если строка была JSON, поэтому вам нужно только проверить тип с помощью
typeof
источник
"SyntaxError: JSON.parse: unexpected character"
ошибку! , Я думаю, что лучшим решением является использование метода try / catch, о котором говоритсяSerguei Fedorov
здесь: stackoverflow.com/questions/4295386/…Выбранное решение мне не подходит, потому что я получаю
ошибка в Chrome. Это потому, что ошибка выдается, как только при синтаксическом анализе встречается неизвестный символ. Однако есть способ обойти это, если вы возвращаете только строковые значения через ajax (что может быть довольно полезно, если вы используете PHP или ASPX для обработки запросов ajax и можете или не можете возвращать JSON в зависимости от условий)
Решение довольно простое, вы можете сделать следующее, чтобы проверить, был ли это действительный возврат JSON.
Как я уже сказал, это решение, если вы либо возвращаете материал строкового типа из вашего запроса AJAX, либо если вы возвращаете смешанный тип.
источник
false
также является допустимым JSON). Вопрос только в одном: какfalse
isJSON(someValue)
.Решение 3 (самый быстрый способ)
Вы можете использовать это:
Лучший способ подтвердить, что объект относится к типу JSON или массиву, выглядит следующим образом:
Решение 1
Решение 2
Но, строго говоря, массив - это часть синтаксиса JSON. Таким образом, следующие два примера являются частью ответа JSON:
И:
AJAX / JQuery (рекомендуется)
Если вы используете JQuery для передачи информации через AJAX. Я рекомендую вам указать в атрибуте «dataType» значение «json», таким образом, если вы получите JSON или нет, JQuery проверит его за вас и сделает это известным через свои функции «успех» и «ошибка». Пример:
источник
Если у вас есть jQuery, используйте isPlainObject .
источник
true
.источник
Поскольку это просто false и объект json, почему бы вам не проверить, ложно ли оно, иначе это должен быть json.
источник
Я знаю, что на эту ветку уже ответили, но приход сюда на самом деле не решил мои проблемы, я нашел эту функцию где-то еще. может быть, кто-то, придя сюда, найдет в нем какую-то пользу;
источник
источник
Если вы хотите явно протестировать действительный JSON (в отличие от отсутствия возвращаемого значения
false
), вы можете использовать подход синтаксического анализа, как описано здесь .источник
Мне не очень нравится принятый ответ. В первую очередь для этого требуется jQuery, который не всегда доступен или необходим. Во-вторых, он выполняет полную структуризацию объекта, что для меня является излишним. Вот простая функция, которая тщательно определяет, является ли значение JSON-подобным, используя не что иное, как несколько частей библиотеки lodash для универсальности.
Я даже нашел время, чтобы поместить его в npm как пакет: https://npmjs.com/package/is-json-object . Используйте его вместе с чем-то вроде Webpack чтобы получить его в браузере.
Надеюсь, это кому-то поможет!
источник
Я использую это для проверки объекта JSON
Я использую это для проверки строки JSON
источник
Я попробовал все предложенные ответы, у меня ничего не получилось, поэтому мне пришлось использовать
мотыга, которая помогает кому-то еще с этой проблемой
источник
Вы должны всегда возвращать json , но изменять его статус или, в следующем примере, свойство ResponseCode :
источник