AJAX: Check if a string is JSON?

前端 未结 7 2051
甜味超标
甜味超标 2020-12-02 21:32

My JavaScript sometimes crashes on this line:

var json = eval(\'(\' + this.responseText + \')\');

Crashes are caused when the argument of <

相关标签:
7条回答
  • 2020-12-02 22:13

    There is a tiny library that checks JavaScript types: is.js

    is.json({foo: 'bar'});
    => true
    
    // functions are returning as false
    is.json(toString);
    => false
    
    is.not.json([]);
    => true
    
    is.all.json({}, 1);
    => false
    
    is.any.json({}, 2);
    => true
    
    // 'all' and 'any' interfaces can also take array parameter
    is.all.json([{}, {foo: 'bar'}]);
    => true
    
    

    Actually is.js is much more then this, some honorable mentions:

    var obj = document.createElement('div');
    is.domNode(obj);
    => true
    
    is.error(new Error());
    => true
    
    is.function(toString);
    => true
    
    is.chrome();
    => true if current browser is chrome
    
    
    
    0 讨论(0)
  • 2020-12-02 22:18

    The problem with depending on the try-catch approach is that JSON.parse('123') = 123 and it will not throw an exception. Therefore, In addition to the try-catch, we need to check the type as follows:

    function isJsonStr(str) {
        var parsedStr = str;
        try {
            parsedStr = JSON.parse(str);
        } catch (e) {
            return false;
        }
        return typeof parsedStr == 'object'
    }
    
    0 讨论(0)
  • 2020-12-02 22:20

    Maybe this helps: With this code, you can get directly your data…

    <!DOCTYPE html>
    <html>
    <body>
    
    <h3>Open console, please, to view result!</h3>
    <p id="demo"></p>
    
    <script>
    var tryJSON = function (test) {
    	try {
    	    JSON.parse(test);
    	}
    	catch(err) {
        	// maybe you need to escape this… (or not)
    	    test = '"'+test.replace(/\\?"/g,'\\"')+'"';
    	}
    	eval('test = '+test);
    	console.debug('Try json:', test);
    };
    
    // test with string…
    var test = 'bonjour "mister"';
    tryJSON(test);
    // test with JSON…
    var test = '{"fr-FR": "<p>Ceci est un texte en français !</p>","en-GB": "<p>And here, a text in english!</p>","nl-NL": "","es-ES": ""}';
    tryJSON(test);
    </script>
    
    </body>
    </html>

    0 讨论(0)
  • 2020-12-02 22:20

    Why you can't just check what is the response? It is more more efficient.

    var result;
    
    if (response.headers['Content-Type'] === 'application/json')
        result = JSON.parse(this.responseText);
    else
        result = this.responseText;
    

    screen1

    0 讨论(0)
  • 2020-12-02 22:23

    I highly recommend you use a javascript JSON library for serializing to and from JSON. eval() is a security risk which should never be used unless you are absolutely certain that its input is sanitized and safe.

    With a JSON library in place, just wrap the call to its parse() equivalent in a try/catch-block to handle non-JSON input:

    try
    {
      var jsonObject = JSON.parse(yourJsonString);
    }
    catch(e)
    {
      // handle error 
    }
    
    0 讨论(0)
  • 2020-12-02 22:29

    If you include the JSON parser from json.org, you can use its parse() function and just wrap it in a try/catch, like so:

    try
    {
       var json = JSON.parse(this.responseText);
    }
    catch(e)
    {
       alert('invalid json');
    }
    

    Something like that would probably do what you want.

    0 讨论(0)
提交回复
热议问题