вы можете использовать вместо этого:
axes.set_xticks(ticks, minor=False)
и
axes.set_xticklabels(labels, fontdict=None, minor=False)
Комментарий сначала. Вопрос заключался в том, чтобы не использовать try/catch
. Если вы не против использовать его, прочитайте ответ ниже. Здесь мы просто проверяем строку JSON
, используя regexp, и она будет работать в большинстве случаев не во всех случаях.
Посмотрите вокруг линии 450 в https: / /github.com/douglascrockford/JSON-js/blob/master/json2.js
Существует регулярное выражение, которое проверяет правильность JSON, например:
if (/^[\],:{}\s]*$/.test(text.replace(/\\["\\\/bfnrtu]/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
//the json is ok
}else{
//the json is not ok
}
EDIT: новая версия json2.js делает более сложный синтаксический разбор, чем предыдущий, но все же основывается на замене регулярного выражения (из комментария @Mrchief )
Здесь мой рабочий код:
function IsJsonString(str) {
try {
var json = JSON.parse(str);
return (typeof json === 'object');
} catch (e) {
return false;
}
Я предпочитаю этот путь:
if (!typeof arg == 'object') {
//Not JSon
} else {
//Json
}
typeof arg !== 'object'
).
– Matt McDonald
19 July 2013 в 17:14
'foo bar'
или если arg является { foo:'bar' }
, ваш тест скажет, что это JSON. Если вы исправили свой код и имели if( typeof arg !== 'object' )
, тогда ваш тест скажет, что { foo: bar }
является JSON, но он скажет, что '{ foo: bar }'
не является JSON (это не так !, но исходный вопрос спрашивал, как сказать если строка была действительной JSON)
– Matt McDonald
20 July 2013 в 13:01
typeof arg
представляет собой строку, такую как «объект». или "строка" или "число". !"any string"
неверно. false == 'object'
всегда будет оцениваться как false.
– Tasgall
26 June 2017 в 19:45
О, вы можете определенно использовать try catch, чтобы проверить, использует ли его или нет действительный JSON
Tested on Firfox Quantum 60.0.1
функцию внутри функцию для проверки JSON и использование этого вывода для проверки строки. слышит пример.
function myfunction(text){
//function for validating json string
function testJSON(text){
try{
if (typeof text!=="string"){
return false;
}else{
JSON.parse(text);
return true;
}
}
catch (error){
return false;
}
}
//content of your real function
if(testJSON(text)){
console.log("json");
}else{
console.log("not json");
}
}
//use it as a normal function
myfunction('{"name":"kasun","age":10}')
Вы можете использовать функцию javascript eval () , чтобы убедиться, что она действительна.
например
var jsonString = '{ "Id": 1, "Name": "Coke" }';
var json;
try {
json = eval(jsonString);
} catch (exception) {
//It's advisable to always catch an exception since eval() is a javascript executor...
json = null;
}
if (json) {
//this is json
}
В качестве альтернативы вы можете использовать JSON.parse
из json.org :
try {
json = JSON.parse(jsonString);
} catch (exception) {
json = null;
}
if (json) {
//this is json
}
Надеюсь, что это поможет.
ВНИМАНИЕ: eval()
опасно, если кто-то добавляет вредоносный JS-код, поскольку он выполнит его. Убедитесь, что строка JSON заслуживает доверия , т. Е. Вы получили ее из надежного источника.
Изменить Для моего 1-го решения рекомендуется сделать это.
try {
json = eval("{" + jsonString + "}");
} catch (exception) {
//It's advisable to always catch an exception since eval() is a javascript executor...
json = null;
}
В гарантировать json-ness. Если jsonString
не является чистым JSON, eval выдаст исключение.
Кажется, я знаю, почему вы хотите этого избежать. Но, возможно, попробуйте & amp; catch! == try & amp; поймать. o) Это пришло мне в голову:
var json_verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};
Таким образом, вы можете также использовать грязный клип для объекта JSON, например:
JSON.verify = function(s){ try { JSON.parse(s); return true; } catch (e) { return false; }};
. По мере того, как это было как можно скорее, оно может не прерываться при ошибке.
if(resp) {
try {
resp = $.parseJSON(resp);
console.log(resp);
} catch(e) {
alert(e);
}
}
надеюсь, что это сработает и для вас
function get_json(txt)
{ var data
try { data = eval('('+txt+')'); }
catch(e){ data = false; }
return data;
}
Если есть ошибки, верните false.
Если ошибок нет, верните данные json
Использовать парсер JSON, например JSON.parse
:
function IsJsonString(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
JSON.parse("false")
также оценивается как false i>.
– Gumbo
1 March 2016 в 20:54
в прототипе js мы имеем метод isSON. попробуйте
http://api.prototypejs.org/language/string/prototype/isjson/
даже http: // www .prototypejs.org / learn / json
"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();
"{ foo: 42 }".isJSON()
? Если false
, как я предполагаю (результат должен следовать функции его документа), то хороший вопрос в том, почему он ложный? { foo: 42 }
, кажется, отлично действует JSON.
– trejder
29 September 2012 в 10:58
Я заключил из вступительного комментария, что пример использования определяет, является ли ответ HTML или JSON. В этом случае, когда вы делаете , получаете JSON, вы, вероятно, должны разбирать его и обрабатывать некорректный JSON в какой-то момент вашего кода. Помимо всего прочего, я предполагаю, что вы хотели бы получить информацию от своего браузера, если ожидается JSON, но недействительный JSON, полученный (как и пользователи по доверенности какого-либо значимого сообщения об ошибке)!
Выполнение полного регулярного выражения для JSON поэтому (как это было бы - по моему опыту - для большинства случаев использования). Вероятно, вам было бы лучше использовать что-то вроде ниже:
function (someString) {
// test string is opened with curly brace or machine bracket
if (someString.trim().search(/^(\[|\{){1}/) > -1) {
try { // it is, so now let's see if its valid JSON
var myJson = JSON.parse(someString);
// yep, we're working with valid JSON
} catch (e) {
// nope, we got what we thought was JSON, it isn't; let's handle it.
}
} else {
// nope, we're working with non-json, no need to parse it fully
}
}
, который должен сэкономить на использовании дескриптора исключений, действительный код не JSON и позаботится о duff json на одновременно.
Я использовал очень простой метод для проверки строки, как это действительный JSON или нет.
function testJSON(text){
if (typeof text!=="string"){
return false;
}
try{
JSON.parse(text);
return true;
}
catch (error){
return false;
}
}
Результат с действительной строкой JSON:
var input='["foo","bar",{"foo":"bar"}]';
testJSON(input); // returns true;
Результат с простая строка;
var input='This is not a JSON string.';
testJSON(input); // returns false;
Результат с объектом:
var input={};
testJSON(input); // returns false;
Результат с нулевым входом:
var input=null;
testJSON(input); // returns false;
Последний возвращает false, тип нулевых переменных - объект.
Это работает каждый раз. :)
null
возвращает false. Но "ложный" вход является допустимой строкой JSON. Это будет проанализировано на boolean (false)
. Теперь я изменяю код, чтобы быть более точным.
– kukko
16 March 2018 в 09:36
Из определения Prototype framework String.isJSON
здесь
/**
* String#isJSON() -> Boolean
*
* Check if the string is valid JSON by the use of regular expressions.
* This security method is called internally.
*
* ##### Examples
*
* "something".isJSON();
* // -> false
* "\"something\"".isJSON();
* // -> true
* "{ foo: 42 }".isJSON();
* // -> false
* "{ \"foo\": 42 }".isJSON();
* // -> true
**/
function isJSON() {
var str = this;
if (str.blank()) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}
, так что это версия, которая может использоваться при передаче строкового объекта
function isJSON(str) {
if ( /^\s*$/.test(str) ) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}
function isJSON(str) {
if ( /^\s*$/.test(str) ) return false;
str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@');
str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']');
str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, '');
return (/^[\],:{}\s]*$/).test(str);
}
console.log ("this is a json", isJSON( "{ \"key\" : 1, \"key2@e\" : \"val\"}" ) )
console.log("this is not a json", isJSON( "{ \"key\" : 1, \"key2@e\" : pippo }" ) )
Я знаю, что я на 3 года опоздал на этот вопрос, но мне захотелось вздрогнуть.
Хотя решение Gumbo отлично работает, оно не обрабатывает несколько случаев где исключение не возникает для JSON.parse({something that isn't JSON})
Я также предпочитаю возвращать разобранный JSON одновременно, поэтому вызывающему коду не нужно вызывать JSON.parse(jsonString)
второй раз.
Это, похоже, хорошо работает для моих нужд:
function tryParseJSON (jsonString){
try {
var o = JSON.parse(jsonString);
// Handle non-exception-throwing cases:
// Neither JSON.parse(false) or JSON.parse(1234) throw errors, hence the type-checking,
// but... JSON.parse(null) returns null, and typeof null === "object",
// so we must check for that, too. Thankfully, null is falsey, so this suffices:
if (o && typeof o === "object") {
return o;
}
}
catch (e) { }
return false;
};
undefined
, а не false
, потому что false
является допустимой строкой json и нет возможности различать tryParseJSON("false")
и tryParseJSON("garbage")
– sparebytes
22 February 2018 в 18:32
// vanillaJS
function isJSON(str) {
try {
return (JSON.parse(str) && !!str);
} catch (e) {
return false;
}
}
Использование: isJSON({})
будет false
, isJSON('{}')
будет true
.
Чтобы проверить, что что-то есть Array
или Object
( проанализировано JSON):
// vanillaJS
function isAO(val) {
return val instanceof Array || val instanceof Object ? true : false;
}
// ES2015
var isAO = (val) => val instanceof Array || val instanceof Object ? true : false;
Использование: isAO({})
будет true
, isAO('{}')
будет false
.
return !!(JSON.parse(str) && str);
должен блокировать нулевые значения. Я обновлю ответ с помощью этого кода.
– Machado
23 August 2017 в 20:08
parse()
, вызывая WTF.
– not2qubit
22 February 2018 в 14:33
Этот ответ уменьшает стоимость инструкции trycatch.
blockquote>Я использовал JQuery для разбора строк JSON, и я использовал оператор trycatch для обработки исключений, но бросая исключения для un-parsable строки замедляли мой код, поэтому я использовал простое Regex, чтобы проверить строку, если это возможная строка JSON или нет, не выходя из пера, проверив ее синтаксис, затем я использовал обычный способ, анализируя строку с помощью JQuery:
if (typeof jsonData == 'string') { if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) { return jsonData; } } try { jsonData = $.parseJSON(jsonData); } catch (e) { }
Я завернул предыдущий код в рекурсивной функции для синтаксического анализа вложенных ответов JSON.
blockquote>
var jsonstring='[{"ConnectionString":"aaaaaa","Server":"ssssss"}]';
if(((x)=>{try{JSON.parse(x);return true;}catch(e){return false}})(jsonstring)){
document.write("valide json")
}else{
document.write("invalide json")
}
Вот также версия для машинописного текста:
JSONTryParse(input) {
try {
//check if the string exists
if (input) {
var o = JSON.parse(input);
//validate the result too
if (o && o.constructor === Object) {
return o;
}
}
}
catch (e) {
}
return false;
};
Возможно, это будет полезно:
function parseJson(code)
{
try {
return JSON.parse(code);
} catch (e) {
return code;
}
}
function parseJsonJQ(code)
{
try {
return $.parseJSON(code);
} catch (e) {
return code;
}
}
var str = "{\"a\":1,\"b\":2,\"c\":3,\"d\":4,\"e\":5}";
alert(typeof parseJson(str));
alert(typeof parseJsonJQ(str));
var str_b = "c";
alert(typeof parseJson(str_b));
alert(typeof parseJsonJQ(str_b));
output:
IE7: строка, объект, строка, строка
CHROME: объект, объект, строка , строка