How to check if a string is a valid JSON string in JavaScript without using Try/Catch

前端 未结 24 1784
暖寄归人
暖寄归人 2020-11-22 07:50

Something like:

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

//should be true
IsJsonString(jsonString);

//should be false
IsJsonString(\"foo\");         


        
相关标签:
24条回答
  • 2020-11-22 08:23

    The function IsJsonString(str), that is using JSON.parse(str), doesn't work in my case.
    I tried to validate json output from GraphiQL it always return false. Lucky me, isJSON works better:

    var test = false;
    
    $('body').on('DOMSubtreeModified', '.resultWrap', function() {
    
        if (!test) {   
            var resultWrap = "{" + $('#graphiql .resultWrap').text().split("{").pop();
            if isJSON(resultWrap) {test = !test;}
            console.log(resultWrap); 
            console.log(resultWrap.isJSON());
        }
    
    });
    

    Sample output:

    THREE.WebGLRenderer 79
    draw.js:170 {xxxxxxxxxx​
    draw.js:170 false
    draw.js:170 {xxxxxxxxxx ​
    draw.js:170 false
    draw.js:170 {xxxxxxxxxx ​
    draw.js:170 false
    draw.js:170 {xxxxxxxxxx ​
    draw.js:170 false
    draw.js:170 {​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}​
    draw.js:170 false
    draw.js:170 {  "PI": 3.141592653589793,  "time": 1570751209006,  "tick": 156,  "tickr": 1.56,  "fps": 41.666666666666664,  "width": 396.984,  "height": 327}
    draw.js:170 true
    
    
    0 讨论(0)
  • 2020-11-22 08:24

    I know i'm 3 years late to this question, but I felt like chiming in.

    While Gumbo's solution works great, it doesn't handle a few cases where no exception is raised for JSON.parse({something that isn't JSON})

    I also prefer to return the parsed JSON at the same time, so the calling code doesn't have to call JSON.parse(jsonString) a second time.

    This seems to work well for my needs:

    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;
    };
    
    0 讨论(0)
  • 2020-11-22 08:24

    You can use the javascript eval() function to verify if it's valid.

    e.g.

    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
    }
    

    Alternatively, you can use JSON.parse function from json.org:

    try {
      json = JSON.parse(jsonString);
    } catch (exception) {
      json = null;
    }
    
    if (json) {
      //this is json
    }
    

    Hope this helps.

    WARNING: eval() is dangerous if someone adds malicious JS code, since it will execute it. Make sure the JSON String is trustworthy, i.e. you got it from a trusted source.

    Edit For my 1st solution, it's recommended to do this.

     try {
          json = eval("{" + jsonString + "}");
        } catch (exception) {
          //It's advisable to always catch an exception since eval() is a javascript executor...
          json = null;
        }
    

    To guarantee json-ness. If the jsonString isn't pure JSON, the eval will throw an exception.

    0 讨论(0)
  • 2020-11-22 08:26

    Use a JSON parser like JSON.parse:

    function IsJsonString(str) {
        try {
            JSON.parse(str);
        } catch (e) {
            return false;
        }
        return true;
    }
    
    0 讨论(0)
  • 2020-11-22 08:27
    • isValidJsonString - check for valid json string

    • JSON data types - string, number, object (JSON object), array, boolean, null (https://www.json.org/json-en.html)

    • falsy values in javascript - false, 0, -0, 0n, ", null, undefined, NaN - (https://developer.mozilla.org/en-US/docs/Glossary/Falsy)

    • JSON.parse

      • works well for number , boolean, null and valid json String won't raise any error. please refer example below

        • JSON.parse(2) // 2
        • JSON.parse(null) // null
        • JSON.parse(true) // true
        • JSON.parse('{"name":"jhamman"}') // {name: "jhamman"}
        • JSON.parse('[1,2,3]') // [1, 2, 3]
      • break when you parse undefined , object, array etc

        • it gave Uncaught SyntaxError: Unexpected end of JSON input . please refer example below
        • JSON.parse({})
        • JSON.parse([])
        • JSON.parse(undefined)
        • JSON.parse("jack")
    function isValidJsonString(jsonString){
        
        if(!(jsonString && typeof jsonString === "string")){
            return false;
        }
    
        try{
           JSON.parse(jsonString);
           return true;
        }catch(error){
            return false;
        }
    
    }
    
    
    0 讨论(0)
  • 2020-11-22 08:28

    If you're dealing with a response from an AJAX (or XMLHttpRequest) call, what worked for me is to check the response content type and parse or not the content accordingly.

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