在JavaScript中解析JSON文件失败

时间:2017-03-07 17:00:03

标签: angularjs json node.js

我正在尝试访问类型(低位标记)但没有成功

我的代码落在开头(当我检查长度时):

Object.data.ServiceData.modelObjects.length;

(我希望得到modelObjects对象的长度)

我得到了按摩:

  

错误:angular.js:13920 TypeError:无法读取属性'modelObjects'   未定义的

这就是我使用它的方式:

function _getIds() {
    var path = vm.package.path;

    var SERVER_PATH = Config.SERVER_PATH;
    return $q(function (resolve, reject) {
        $http.post(SERVER_PATH + '/getLastGetRelated', { path: vm.package.path })
            .then(
            function (success) {
                resolve(success);
            },
            function (err) {
                reject(err);
            })
    });
}   


this.camera = function() {
    _getIds().then(function(ids){
    console.log(Object.ServiceData.modelObjects.length);
    readJson(ids);
    })
}

1

2 个答案:

答案 0 :(得分:0)

  

我的代码落在开头(当我检查长度时):

Object.data.ServiceData.modelObjects.length;
     

[...]

console.log(Object.ServiceData.modelObjects.length);

实际上,你正在检查:

Object.ServiceData.modelObjects.length

而不是:

Object.data.ServiceData.modelObjects.length;

查看数据外观的最简单方法是暂时更改:

console.log(Object.ServiceData.modelObjects.length);

为:

console.log(JSON.stringify(Object));

但请记住,Object是JavaScript中的内置函数(实际上是构造函数),因此不太可能包含您的数据。

另外,这个:

return $q(function (resolve, reject) {
            $http.post(SERVER_PATH + '/getLastGetRelated', { path: vm.package.path })
                .then(
                function (success) {
                    resolve(success);
                },
                function (err) {
                    reject(err);
                })

可以写成:

return $http.post(SERVER_PATH + '/getLastGetRelated', { path: vm.package.path });

一般建议:

现在,如果您不希望程序在访问可能存在或可能不存在的属性时崩溃,您可以使用:

console.log(Object && Object.data && Object.data.ServiceData
    && Object.data.ServiceData.modelObjects
    && Object.data.ServiceData.modelObjects.length);

或使用lodash:

console.log(_.get(Object, 'data.ServiceData.modelObjects.length'));

或使用hoek:

console.log(hoek.reach(Object, 'data.ServiceData.modelObjects.length'));

请参阅:

总之,您的代码存在很多问题。您很可能对Promises的工作方式,获得的数据,变量以及如何访问所需部件感到困惑。

我的建议是阅读有关promises的更多信息,检查从API获得的数据,并从头开始仔细编写代码。不幸的是,没有人能够像现在一样在表单中为您修复代码,因为我们不知道您的数据是什么样的,以及您想要用它做什么。

答案 1 :(得分:0)

这可能不是问题的答案,但我想指出一件事。 http默认情况下将响应作为promise返回。但是在这里,手动创建了承诺以捕获已经承诺的响应。这是不必要的。只需返回http请求,而不创建像这样的新承诺

function _getIds() {
    var path = vm.package.path;
    var SERVER_PATH = Config.SERVER_PATH;
    return $http.post(SERVER_PATH + '/getLastGetRelated', {
        path: vm.package.path
    })
}
this.camera = function() {
    _getIds().then(function(ids) {
        console.log(Object.ServiceData.modelObjects.length);
        readJson(ids);
    })
}