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

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

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

//should be true
IsJsonString(jsonString);

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

Решение не должно содержать try / catch.Некоторые из нас включают «разбить все ошибки», и им не нравится, когда отладчик ломает эти недопустимые строки JSON.

Ответы [ 18 ]

2 голосов
/ 10 апреля 2017

Я думаю, я знаю, почему вы хотите избежать этого.Но, возможно, попробуй и поймай! == попробуй и поймай.; 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; }};

Как можно более инкапсулировано, это можетперерыв при ошибке.

2 голосов
/ 14 сентября 2010

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

2 голосов
/ 05 ноября 2011

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

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

вывод:

IE7: строка , объект, строка, строка

CHROME: объект,объект, строка, строка

1 голос
/ 29 декабря 2017

Вот и версия для машинописи:

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;
};
1 голос
/ 13 декабря 2017

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

1 голос
/ 01 октября 2017

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")
}
0 голосов
/ 01 июня 2018

О, вы определенно можете использовать try catch, чтобы проверить, действительно ли это 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 голосов
/ 06 марта 2013
function get_json(txt)
{  var data

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

   return data;
}

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

Если ошибок нет, вернуть данные json

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