Javascript 有了RESTful API,我怎么不';如果未定义特定的响应json级别,则不会在客户端出错

Javascript 有了RESTful API,我怎么不';如果未定义特定的响应json级别,则不会在客户端出错,javascript,jquery,json,ajax,Javascript,Jquery,Json,Ajax,下面是一个简单的json响应: { “博客”:{ “标题”:“博客” “段落”:[{ “标题”:“第1段”, “内容”:“内容1” }, { “标题”:“第2段”, “内容”:“内容2” }, { “标题”:“第3段”, “内容”:“内容3” } ], “选择列表”:[“食物”、“游戏”、“情绪”] } } 如果服务器出现问题,段落属性为未定义,如何避免在客户端出错?即使是我也可以成功地获取其他数据,比如blog.title,blog.selectList…等等 如果我不想使用: if(res

下面是一个简单的json响应:

{
“博客”:{
“标题”:“博客”
“段落”:[{
“标题”:“第1段”,
“内容”:“内容1”
}, {
“标题”:“第2段”,
“内容”:“内容2”
}, {
“标题”:“第3段”,
“内容”:“内容3”
}
],
“选择列表”:[“食物”、“游戏”、“情绪”]
}
}
如果服务器出现问题,
段落
属性为
未定义
,如何避免在客户端出错?即使是我也可以成功地获取其他数据,比如
blog.title
blog.selectList
…等等

如果我不想使用:

if(response.blog&&response.blog.parations&&response.blog.parations…){
//做点什么
}
因为如果JSON对象中有多个级别,这不是一种有效的方法。有人有聪明高效的方法吗

更新

@马修赫斯特说:只需检查最低的属性

如果我只检查最低的属性(
response.blog.parations
),这将导致javascript错误,破坏我的站点。因为浏览器发现
response.blog
未定义。在实际情况中,如果
response.blog
undefined
,我将获得
response.error
属性,那么
if(response.blog.parages)
将遇到错误,因为
response
对象没有在javascript中定义
blog
属性。我如何检查最低属性?

您可以使用它。例如

let paragraphs = _.get(response, 'blog.paragraphs', null);

if (!paragraphs) {
    // Couldn't get from response.
} else {
   // Do something with response.blog.paragraphs.
}

你可以这样做-

var blogs = response.blogs;
if(blogs){
    //do something
    var paraData = blogs.paragraphs;
    if (paraData){
        // do some more fun
    }
}
var arrKeys = Object.keys(blogs),
newBlogArr = [] // to get the filtered result;

(function(){
    for(i=0;i<arrKeys.length;i++){

    // to get the filtered defined objects only

        if(blogs[arrKeys[i]] !== null || blogs[arrKeys[i]] !== undefined){

            //Now simply push that array in newBlogArr;

            newBlogArr.push(blogs[arrKeys[i]]);
        }
    }
    return newBlogArr;
})();


你可以这样做-

var blogs = response.blogs;
if(blogs){
    //do something
    var paraData = blogs.paragraphs;
    if (paraData){
        // do some more fun
    }
}
var arrKeys = Object.keys(blogs),
newBlogArr = [] // to get the filtered result;

(function(){
    for(i=0;i<arrKeys.length;i++){

    // to get the filtered defined objects only

        if(blogs[arrKeys[i]] !== null || blogs[arrKeys[i]] !== undefined){

            //Now simply push that array in newBlogArr;

            newBlogArr.push(blogs[arrKeys[i]]);
        }
    }
    return newBlogArr;
})();
var arrKeys=Object.keys(博客),
newBlogArr=[]//获取过滤结果;
(功能(){

对于(i=0;如果服务器端处理失败或内容无效,i您可能会返回http错误。然后只需在客户端检查http错误。您的意思是段落中的对象也可能未定义吗?如果是,则是否要拒绝特定对象?或整个段落数组?如果
段落
未定义,但我希望获得成功的数据,如blog.title、blog.selectList等。通常,我们使用if
(response.blog&&response.blog.parages…)
,如果我使用这种方式,则表示response.blog.parages不正确(因为
parages
未定义),然后我将返回,无法在
中执行下一个操作,如果
,有什么想法吗?对不起,请不要关心
内容
,我只想知道处理api响应json数据的更好方法,因为如果每个属性都是以复杂的json格式定义的,则无法检查它。@SevenLee其他人说的是,在某些poi中nt,数据太糟糕了,您只需要返回一个完整的错误。Aewsome!那就是我需要:)如果我需要
blog.parages.title.author.islike
属性值,以这种方式,如果我需要检查
blog.parages
blog.parages.title
blog.parages.title.authors
属性值,那么您就需要
获取(响应,'blog.parages.title.authors',null)
。如果存在这样或
null
@SevenLee,您会得到值。要清楚,这并不比您原来拥有的更有效。它只是将您拥有的隐藏到一个小函数中。有人可能会说,它实际上更慢,因为它是一个附加函数调用,并且您必须让用户下载lodash只是为了一个简单的函数离子调用。@MatthewHerbst我不认为这是一个速度问题,而是代码可读性和维护问题。从复杂级别JSON格式中高效获取特定属性的方法无法解决,因为您仍然要检查每个属性,每个级别并检查它们是否已定义。如果属性深陷嵌套地狱,将有许多嵌套<代码>如果
hell.@SevenLee它只会对对象进行第一级检查,无论是否定义,都不会进入子级对象!我明白了…但它仍然需要检查每个级别…我们应该尝试另一种方法来获得某些级别属性,我的意思是有任何算法或新机制支持它吗?