Vyhledávání na webu

javascript - Jak mohu bezpečně použít JSON.parse na objekt typu string, který může být jednoduchý řetězec nebo objekt typu string?


Potřebuji být schopen analyzovat řetězec ve formátu objektu nebo v prostém řetězcovém formátu. Jaký je nejbezpečnější způsob, jak to udělat?

Zkoušel jsem JSON.parse(data), ale nefunguje to v případě, že data jsou obyčejný řetězec.

UPRAVIT - Vybrané řešení

Díky tobě jsem tento problém vyřešil takto:

try {
    dataObj = JSON.parse(data);
} catch (err) {
    if (typeof data === "object") {
        dataObj = data;
    } else {
        dataObj = {};
    }
}

Odpověď č. 1

Vytvořte si pomocnou funkci a použijte ji.

function parseValue(value) {
    try
    {
        return JSON.parse(value);
    }
    catch (ex)
    {
        // JSON format was invalid
        // handle errors is you need to
    }

    return value;
}

Pokud jste dost odvážní, můžete také rozšířit String.prototype, takže jeho volání by se stalo opravdu přímočarým.

String.prototype.parseJSON = String.prototype.parseJSON || function() {
    try
    {
        return JSON.parse(this);
    }
    catch (ex)
    {
        // JSON format was invalid
        // handle errors is you need to
    }

    return this;
};

A pak byste to jednoduše nazvali tímto způsobem:

// string in a variable
var s = "Some non-JSON string";
s.parseJSON();
// string literal
'{"b":true,"n":1}'.parseJSON();

Odpověď č. 2

Použijte try catch:

var result;
try {
   result = JSON.parse(data);
} catch (err) {
   if (typeof data == 'string') result = data;
   else console.error(err);
}