开发者问题收集

我如何检查我的 JSON 字段是否已定义?

2020-02-09
74

我正在解析 JSON 并尝试访问它的一个字段,即数组。

const myObj: MyObj = JSON.parse(myJson);
console.log(myObj.myArray); //SyntaxError: Unexpected end of JSON input
console.log(myObj.myArray == 'undefined'); //SyntaxError: Unexpected end of JSON input
console.log(myObj.myArray.length); //TypeError: Cannot read property 'length' of undefined
console.log(myObj.myArray !== null); //true

我可以毫无问题地遍历我的数组并处理我需要的数据。但我需要检查以确保 myArray 字段在遍历时有效。当我尝试执行此操作时,我收到如上所示的错误。

我非常困惑。有人可以向我解释发生了什么以及如何解决它吗?

3个回答

使用 in 时要小心,因为它会搜索整个原型链。

const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);

console.log('constructor' in myObj); // true (BAD)

相反,请尝试使用 .hasOwnProperty() ,如下所示:

const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);

console.log(myObj.hasOwnProperty("a")); // true
console.log(myObj.hasOwnProperty("constructor")); // false
Oliver Ni
2020-02-09

如果您担心存在性,您可以简单地检查

if (myObj.myArray) {

如果您想确认存在并确认它是一个数组

if (myObj.myArray && Array.isArray(myObj.myArray) {

Joe
2020-02-09

您可以使用 in 运算符来检查对象原型链中是否指定了某个属性:

const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);

console.log('myArray' in myObj); // false
console.log('a' in myObj); // true

或者,您可以检查字段是否为 undefined (如果是,则它不存在于 JSON.parse 返回的对象中),最安全的方法是使用 typeof 运算符:

const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);

console.log(typeof myObj.myArray !== 'undefined'); // false
console.log(typeof myObj.a !== 'undefined'); // true

直接与应避免使用 undefined (例如 myObj.myArray !== undefined ),因为 undefined 可以被 覆盖或遮蔽

编辑 :正如@OliveNi 指出的那样,使用 in 运算符很危险,因为它会贯穿整个原型链。为了进行更安全的检查(作为 undefined 检查的替代),您可以使用 hasOwnProperty ,如 他的答案 中所示。

Alberto Trindade Tavares
2020-02-09