Как проверить, является ли строка допустимой строкой JSON в JavaScript без использования Try/Catch

Что-то вроде:

var jsonString = '{ "Id": 1, "Name": "Coke" }';

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString("foo");
IsJsonString("<div>foo</div>")

Решение не должно содержать try/catch. Некоторые из нас включают "break on all errors", и им не нравится, что отладчик ломается на недействительных JSON-строках.

Комментарии к вопросу (8)

Используйте парсер JSON, например JSON.parse:

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
Комментарии (14)

Я знаю, что я'м 3-летним опозданием к этому вопросу, но я чувствовал, что прояснил.

В то время как Гумбо'ы решение работает отлично, это не'т обрабатывать несколько случаев, когда исключение для формат JSON.разобрать({то, что это&#39;т в JSON})

Я тоже предпочитаю возвращать разобранный JSON и в то же время, так что вызывающий код не'т придется позвонить в JSON.разобрать(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;
};
Комментарии (15)
Решение

Комментарий первой. Вопрос был о том, что не используя попробовать/поймать.<БР/> Если вы не возражаете, чтобы использовать его, читайте ответ ниже. Здесь мы просто проверяем наJSON` как строку, используя регулярное выражение, и оно будет работать в большинстве случаев, не во всех случаях.

Посмотрите вокруг линии 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

}

Редактировать: новая версия json2.js делает более сложный парсинг, чем выше, но все же на основе регулярного выражения заменить ( от комментарий @Mrchief )

Комментарии (14)
// vanillaJS
function isJSON(str) {
    try {
        return (JSON.parse(str) && !!str);
    } catch (e) {
        return false;
    }
}

Использование: isJSON({}) будет ложь, isJSON(&#39;{}&#39;) будет "истина".

Чтобы проверить, если что-то будет выбора или объект (разбирается в 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;

Использование: Исао({}) будет истина, Исао(&#39;{}&#39;) будет "ложь".

Комментарии (3)

Я использовал очень простой метод, чтобы проверить строку, как это'ы действительный 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 переменных объекта.

Это работает каждый раз. :)

Комментарии (4)

Вот мой рабочий код:

function IsJsonString(str) {
  try {
    var json = JSON.parse(str);
    return (typeof json === 'object');
  } catch (e) {
    return false;
  }
}
Комментарии (1)

В prototypeJS у нас есть метод isJSON. Вы можете попробовать его. Даже json может помочь.

"something".isJSON();
// -> false
"\"something\"".isJSON();
// -> true
"{ foo: 42 }".isJSON();
// -> false
"{ \"foo\": 42 }".isJSON();
Комментарии (5)

Из строки рамках прототипа.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);
  }

так это версия, которая может быть использована передача объекта String

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 }" ) )

в

Комментарии (0)

Может быть, это будет полезно:

    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));

выход:

ИЕ7: струны,объекта,строки,строки

Хром: объект,объекта,строки,строки

Комментарии (0)

этот ответ, чтобы снизить стоимость trycatch заявление.

Я использовал jQuery для разбора формата JSON строки и я trycatch заявление для обработки исключений, но исключений для ООН-распознаваемо струн замедлился мой код, так что я использовал простое регулярное выражение для проверки строки, если это возможно в JSON строку и не без перьев, проверяя его'с синтаксисом, то я использовал обычный способ разбора строки с помощью jQuery :

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

я завернул предыдущий код в рекурсивную функцию для разбора вложенных JSON ответы.

Комментарии (1)

Я думаю, я знаю, почему вы хотите, чтобы избежать этого. Но, может быть, попробовать & улов !== попробовать & поймать. ;О) это пришло мне в голову:

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; }};

Как это encapsuled, как это возможно, он не может нарушить по ошибке.

Комментарии (0)

Здесь тоже машинопись версия:

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;
};
Комментарии (0)
if(resp) {
    try {
        resp = $.parseJSON(resp);
        console.log(resp);
    } catch(e) {
        alert(e);
    }
}

надеюсь, что это работает для вас тоже

Комментарии (0)

Я делаю вывод из вступительного комментария, что речь разграничить, является ли ответ является HTML или JSON. В этом случае, когда вы действительно получать в формате JSON, вы, вероятно, следует Разбор и обработку в любом случае недопустимый формат JSON в какой-то момент в коде. Кроме всего, я полагаю, вы хотели бы быть проинформированы в вашем браузере должен быть в формате JSON, но недопустимый формат JSON получил (а пользователи по доверенности на какое-то осмысленное сообщение об ошибке)!

Делаю полный regex для 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 код и заботиться о Дафф в формате JSON в то же время.

Комментарии (0)

в

var jsonstring='[{"ConnectionString":"aaaaaa","Server":"ssssss"}]';

if(((x)=>{try{JSON.parse(x);return true;}catch(e){return false}})(jsonstring)){

document.write("valide json")

}else{

документ.пишут (на"invalide в JSON и") }

в

Комментарии (0)

Вы можете использовать функцию 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-строка достоверна, т.е. вы получили ее из надежного источника.

Редактирование Для моего первого решения рекомендуется сделать следующее.

 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 будет выдавать исключение.

Комментарии (11)

Да, вы можете определенно использовать попробовать поймать, чтобы проверить, является ли его или не допустимый JSON

Проверено на Firfox Quantom 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}')
Комментарии (0)
function get_json(txt)
{  var data

   try     {  data = eval('('+txt+')'); }
   catch(e){  data = false;             }

   return data;
}

Если есть ошибки, возвращает false.

Если ошибок нет, возвращать JSON

Комментарии (2)

Функция IsJsonString(ул.), то есть через формат JSON.разобрать(ул.), Не't работа в моем случае. Я пытался проверить выходной формат JSON GraphiQL он всегда возвращает false. Мне повезло, isJSON работает лучше:

`` ВАР тест = ложь;

$('тело').на('DOMSubtreeModified', '.resultWrap', функция() {

если (!тест) { ВАР resultWrap = на "{" в + $('#graphiql .resultWrap').текст().Сплит (на"{" - а).поп(); если isJSON(resultWrap) {тест = !тест;} консоль.журнал(resultWrap); консоль.журнал(resultWrap.isJSON()); }

}); `` Пример вывода:

`` Три.WebGLRenderer 79 рисовать.ДШ:170 {ХХХХХХХХХХ рисовать.ДШ:170 ложные рисовать.ДШ:170 {ХХХХХХХХХХ  рисовать.ДШ:170 ложные рисовать.ДШ:170 {ХХХХХХХХХХ  рисовать.ДШ:170 ложные рисовать.ДШ:170 {ХХХХХХХХХХ  рисовать.ДШ:170 ложные рисовать.ДШ:170 { рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"Я ПИ&;: 3.141592653589793, рисовать.ДШ:170 ложные рисовать.ДШ:170 {  "Ну все, мне пи&;: 3.141592653589793,   на"Время": 1570751209006, рисовать.ДШ:170 ложные рисовать.ДШ:170 {  "Ну все, мне пи&;: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по: 156, рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"пи" и: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по -: 156,   на"tickr поддерживает" и: 1.56, рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"пи" и: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по -: 156,   на"tickr поддерживает" и: 1.56,   на"кадров" и: 41.666666666666664, рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"пи" и: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по -: 156,   на"tickr поддерживает и": 1.56,   на"кадров" и: 41.666666666666664,   на"ширина" и: 396.984, рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"пи" и: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по -: 156,   на"tickr поддерживает и": 1.56,   на"кадров" и: 41.666666666666664,   на"ширина" и: 396.984,   на"высоте", которая: 327 рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"пи" и: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по -: 156,   на"tickr поддерживает и": 1.56,   на"кадров" и: 41.666666666666664,   на"ширина" и: 396.984,   на"высоте", которая: 327} рисовать.ДШ:170 ложные рисовать.ДШ:170 {   на"пи" и: 3.141592653589793,   на"Время": 1570751209006,   на"галочки" по -: 156,   на"tickr поддерживает и": 1.56,   на"кадров" и: 41.666666666666664,   на"ширина" и: 396.984,   на"высоте", которая: 327} рисовать.ДШ:170 правда

``

Комментарии (0)