Использование try / catch для проверки JSON? [Дубликат]

вы можете использовать вместо этого:

axes.set_xticks(ticks, minor=False)

и

axes.set_xticklabels(labels, fontdict=None, minor=False)
354
задан Chris Martin 18 March 2016 в 21:36
поделиться

19 ответов

Комментарий сначала. Вопрос заключался в том, чтобы не использовать 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 )

116
ответ дан Liam 15 August 2018 в 16:30
поделиться
  • 1
    Это только проверка того, безопасен ли код для использования eval. Например, следующая строка '2011-6-27' пройдет этот тест. – SystemicPlural 27 July 2011 в 17:22
  • 2
    @SystemicPlural, да, но вопрос касался не использования try / catch – Mic 25 July 2013 в 11:33
  • 3
    Вы не можете проверить, является ли строка допустимой JSON с регулярным выражением в JavaScript, поскольку регулярные выражения JS не поддерживают необходимые расширения (рекурсивные регулярные выражения), которые позволяют вам это делать. Ваш код выше с ошибкой "{& quot ;. – Venge 1 June 2014 в 23:12
  • 4
    @Mic json2.js больше не использует эту простую проверку (вместо этого используется 4-этапный синтаксический анализ для определения действительного JSON). Предлагает пересмотреть или удалить ваш ответ. Обратите внимание, что я не думаю, что есть что-то неправильное с «не имея try / catch в качестве единственного механизма для проверки JSON». как подход. – Mrchief 20 June 2016 в 18:21
  • 5
    Просто потому, что он помогает ему, это не значит, что он помогает остальным из нас, которые спустя годы имеют тот же вопрос. – McKay 11 August 2016 в 17:36

Здесь мой рабочий код:

function IsJsonString(str) {
try {
  var json = JSON.parse(str);
  return (typeof json === 'object');
} catch (e) {
  return false;
}
-1
ответ дан Anand Kumar 15 August 2018 в 16:30
поделиться

Я предпочитаю этот путь:

if (!typeof arg == 'object') {
    //Not JSon
} else {
    //Json
}
-10
ответ дан AnonyDev 15 August 2018 в 16:30
поделиться
  • 1
    Вопрос заключается в том, как определить правильность строки JSON (поэтому ее можно преобразовать в объект). Ваш тест требует, чтобы у вас уже был объект (и, в качестве небольшого аспекта, для других это намного легче понять, если вы пишете отрицательные утверждения, например, например: typeof arg !== 'object'). – Matt McDonald 19 July 2013 в 17:14
  • 2
    Хмм .. Не объект. Это тест ... Не понимаю ваш комментарий. Я использую этот код, и он работает очень хорошо. – AnonyDev 19 July 2013 в 20:42
  • 3
    На данный момент, что бы вы ни отправили в свою функцию как значение arg, это скажет, что это JSON, потому что это неверно. Поэтому, если arg является 'foo bar' или если arg является { foo:'bar' }, ваш тест скажет, что это JSON. Если вы исправили свой код и имели if( typeof arg !== 'object' ), тогда ваш тест скажет, что { foo: bar } является JSON, но он скажет, что '{ foo: bar }' не является JSON (это не так !, но исходный вопрос спрашивал, как сказать если строка была действительной JSON) – Matt McDonald 20 July 2013 в 13:01
  • 4
    массивы также являются объектами – FluffyNights 14 May 2017 в 10:15
  • 5
    Развернувшись на том, почему это неверно (для проверки того, что что-то является объектом, он явно не отвечает на вопрос OP о том, является ли строка действительной JSON) - порядок выполнения делает это так, что буквально никакой ввод не может привести к выполнению первого блока. 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}')
0
ответ дан Aylian Craspa 15 August 2018 в 16:30
поделиться

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

3
ответ дан Buhake Sindi 15 August 2018 в 16:30
поделиться
  • 1
    Первый пример использования eval говорит, что & lt; div & gt; foo & lt; / div & gt; & quot; действует JSON. Он может работать по-разному в разных браузерах, но кажется, что в FireFox eval () принимает XML. – Mark Lutton 14 September 2010 в 16:26
  • 2
    Спасибо, но я просто побежал с командой, и они хотят чего-то, что не использует try / catch. Вопрос редактируется вместе с новым названием. Извини за это. – Chi Chan 14 September 2010 в 16:26
  • 3
    @Mark Lutton, тип объекта не будет JSON, а XML Dom Document (я забыл, что такое точный тип в firefox). – Buhake Sindi 14 September 2010 в 16:30
  • 4
    eval также принимает действительный JavaScript, например "alert (5); & quot; и строки в одинарных кавычках, которые недействительны JSON. – Mark Lutton 14 September 2010 в 16:48
  • 5
    Это чистая оценка. – Chris Baker 19 November 2013 в 22:45

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

. По мере того, как это было как можно скорее, оно может не прерываться при ошибке.

2
ответ дан chrixle 15 August 2018 в 16:30
поделиться
if(resp) {
    try {
        resp = $.parseJSON(resp);
        console.log(resp);
    } catch(e) {
        alert(e);
    }
}

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

1
ответ дан Darkcoder 15 August 2018 в 16:30
поделиться
function get_json(txt)
{  var data

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

   return data;
}

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

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

1
ответ дан Emrah Tuncel 15 August 2018 в 16:30
поделиться
  • 1
    В вопросе: «Решение не должно содержать try / catch». – ddmps 6 March 2013 в 05:58
  • 2
    Зачем? Это гарантированный способ ... Было бы глупо извиняться! Мне жаль, что я не знаю английского. я использовал переводчик гугл – Emrah Tuncel 7 March 2013 в 01:32

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

function IsJsonString(str) {
    try {
        JSON.parse(str);
    } catch (e) {
        return false;
    }
    return true;
}
616
ответ дан Gumbo 15 August 2018 в 16:30
поделиться
  • 1
    Спасибо, но я просто побежал с командой, и они хотят чего-то, что не использует try / catch. Вопрос редактируется вместе с новым названием. Извини за это. – Chi Chan 14 September 2010 в 16:26
  • 2
    @trejder: он делает это, потому что 1 не является строкой, попробуйте с "1" – Purefan 5 March 2014 в 01:47
  • 3
    @Gumbo Мой комментарий 1,5 года! :] Я не помню, что я делал две недели назад, и вы просили меня вспомнить этот проект? :] Ни за что... :] – trejder 5 March 2014 в 11:25
  • 4
    Проблема с этим ответом заключается в том, что если строка проверяет и вы ее разбираете, вы проанализируете ее дважды. Не могли бы вы вместо этого возвратить false при плохом анализе, но вернуть объект на успех? – Carcigenicate 29 February 2016 в 01:05
  • 5
    @Carcigenicate Вы могли бы это сделать. Однако JSON.parse("false") также оценивается как false . – 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();
11
ответ дан Ifi 15 August 2018 в 16:30
поделиться
  • 1
    Спасибо, но я думаю, что использование библиотеки прототипов для этого немного завышено. – Chi Chan 14 September 2010 в 16:29
  • 2
    Вы дали четыре примера, но только ТРИ результата. Каков результат для "{ foo: 42 }".isJSON()? Если false, как я предполагаю (результат должен следовать функции его документа), то хороший вопрос в том, почему он ложный? { foo: 42 }, кажется, отлично действует JSON. – trejder 29 September 2012 в 10:58
  • 3
    @trejder К сожалению, спецификация JSON требует цитируемых ключей. – mikermcneil 8 October 2012 в 02:27
  • 4
    И «2002-12-15» .isJSON возвращает true, тогда как JSON.parse («2002-12-15») выдает ошибку. – ychaouche 13 November 2012 в 19:14
  • 5
    Я думаю, что лучший ответ здесь - вытащить эту функцию из библиотеки прототипов и поместить ее здесь. Тем более, что api.prototypejs.org/language/string/prototype/isjson - 404. – jcollum 28 May 2013 в 18:53

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

1
ответ дан Jay Edwards 15 August 2018 в 16:30
поделиться

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

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

7
ответ дан kukko 15 August 2018 в 16:30
поделиться
  • 1
    Кажется, он работает только в 60% случаев. – Jake Wilson 20 November 2016 в 06:03
  • 2
    Можете ли вы объяснить некоторые случаи, когда они не работают? – kukko 21 November 2016 в 14:22
  • 3
    JSON.parse (null), JSON.parse («false») не выдает ошибок, возможно, есть больше примеров – klodoma 15 March 2018 в 11:18
  • 4
    Да, вы правы, я забыл проверить, как ввод является строкой или нет. Если я это сделаю, этот метод с входом 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 }" ) )

4
ответ дан loretoparisi 15 August 2018 в 16:30
поделиться

Я знаю, что я на 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;
};
356
ответ дан Lynn 15 August 2018 в 16:30
поделиться
  • 1
    Из ответов на странице это самый надежный и надежный. – Jonline 30 May 2014 в 18:07
  • 2
    o && o !== null является излишним. – mudasobwa 21 October 2014 в 16:21
  • 3
    Таким образом, используется тройное равенство с typeof, которое всегда возвращает строку. :) – Hein Haraldson Berg 3 December 2014 в 17:09
  • 4
    Несмотря на то, что я старый пост, я подумал, что стоит поставить скрипт , демонстрирующий ваш ответ @matth, обратите внимание, что объекты не будут действительны .. вы должны передать строку JSON. Может пригодиться для тех, кто начинает, я думаю. – MindVox 25 May 2016 в 14:18
  • 5
    Функция должна возвращать 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.

39
ответ дан Machado 15 August 2018 в 16:30
поделиться
  • 1
    Будьте осторожны, так как null передает эту проверку. – Farzad YZ 30 May 2017 в 07:33
  • 2
    return !!(JSON.parse(str) && str); должен блокировать нулевые значения. Я обновлю ответ с помощью этого кода. – Machado 23 August 2017 в 20:08
  • 3
    Это лучший ответ, так как он также позволяет вам проверить, был ли JSON объективом и, таким образом, не прошел тест parse(), вызывая WTF. – not2qubit 22 February 2018 в 14:33

Этот ответ уменьшает стоимость инструкции trycatch.

Я использовал 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.

3
ответ дан Rabih 15 August 2018 в 16:30
поделиться

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

1
ответ дан safi eddine 15 August 2018 в 16:30
поделиться

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

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
ответ дан student 15 August 2018 в 16:30
поделиться

Возможно, это будет полезно:

    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: объект, объект, строка , строка

2
ответ дан user 15 August 2018 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: