开发者问题收集

JavaScript 中解析 JSON 文件失败

2017-03-07
138

我试图访问类型(标记的下方方块)但没有成功

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

Object.data.ServiceData.modelObjects.length;

(例如,我想获取 modelObjects 对象的长度)

我收到了一条消息:

error: angular.js:13920 TypeError: Cannot read property 'modelObjects' of undefined

这是我使用它的方式:

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个回答

这可能不是问题的答案,但我想指出一点。http 默认以承诺的形式返回响应。但在这里,手动创建承诺以捕获已经是承诺的响应。这是不必要的。只需返回 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);
    })
}
Sachila Ranawaka
2017-03-07

my code falls in the beginning (when i check the length) :

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'));

参见:

总之,你的代码存在很多问题代码。您很可能对承诺的工作原理、您获得的数据、在哪个变量中以及如何访问所需的部分感到困惑。

我的建议是阅读更多有关承诺的内容,检查您从 API 获得的数据,并仔细从头开始编写代码。不幸的是,没有人能够以现在的形式为您修复该代码,因为我们不知道您的数据是什么样的,也不知道您到底想用它做什么。

rsp
2017-03-07