我有一个JSON对象,我从服务器获取。我从中获得价值的关键看起来像这样:
var myJson = data.body.region.store.customer.name;
我试图在这里获取名称密钥,但有时JSON(来自我无法控制的服务)将有一些空字段,例如实例名称可能未定义,因此对象实际上看起来像这个:data.body.region.store.customer。有时也可能没有定义客户,商店或区域(如果数据不存在,则服务不会为该值返回空字符串或空字符串)。
所以,如果我需要这个名字,我正在做的是:
if(data.body.region.store.customer.name){
//Do something with the name
}
但是说即使存储没有定义,它也不会得到name的值(我希望它不存在,因为它不存在)并且程序崩溃了。所以我现在正在做的是在使用AND操作数获取值之前检查JSON的每个部分:
if(data && data.body && data.body.region && data.body.region.store && data.body.region.store.customer && data.body.region.store.customer.name){
//Do something with the name value then
}
这是有效的,因为它按顺序检查,所以它首先检查数据是否存在,如果是,它会检查next,如果data.body存在,依此类推。这是每次检查的很多条件,特别是因为我为许多其他事情使用了很多服务,他们也需要自己的条件。因此,只需检查名称是否存在,我需要执行6个条件,当然这些条件似乎并不是非常好的性能(并且整体编码明智)。我想知道是否有更简单的方法可以做到这一点?
答案 0 :(得分:4)
var myJson = null;
try {
myJson = data.body.region.store.customer.name;
}
catch(err) {
//display error message
}
答案 1 :(得分:1)
您可以尝试以下
function test(obj, prop) {
var parts = prop.split('.');
for(var i = 0, l = parts.length; i < l; i++) {
var part = parts[i];
if(obj !== null && typeof obj === "object" && part in obj) {
obj = obj[part];
}
else {
return false;
}
}
return true;
}
test(myJson, 'data.body.region.store.customer.name');