无法获取JSON对象的长度
我在尝试访问NodeJSON中json对象的长度时遇到“TypeError:无法将未定义或null转换为object” 以下是我的数据的外观:无法获取JSON对象的长度,json,node.js,firebase,firebase-realtime-database,dialogflow-es,Json,Node.js,Firebase,Firebase Realtime Database,Dialogflow Es,我在尝试访问NodeJSON中json对象的长度时遇到“TypeError:无法将未定义或null转换为object” 以下是我的数据的外观: { “学院”:[ { “学院”:[], “部门”:[ 1. 2. 3. ], “普通课程”:[], “id”:1, “名称”:“艺术学院”, “短名称”:“, “url”:“/content.php?catoid=16&navoid=1919” }, { “学院”:[], “部门”:[ 4. 5. 6. ], “普通课程”:[], “id”:2, “名称
{
“学院”:[
{
“学院”:[],
“部门”:[
1.
2.
3.
],
“普通课程”:[],
“id”:1,
“名称”:“艺术学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1919”
},
{
“学院”:[],
“部门”:[
4.
5.
6.
],
“普通课程”:[],
“id”:2,
“名称”:“通信学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1920”
},
{
“学院”:[],
“部门”:[
7.
12
],
“普通课程”:[],
“id”:3,
“名称”:“教育学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1921”
},
{
“学院”:[],
“部门”:[
13,
17,
19
],
“普通课程”:[],
“id”:4,
“名称”:“工程与计算机科学学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1922”
},
{
“学院”:[],
“部门”:[
20,
26,
27
],
“普通课程”:[],
“id”:5,
“名称”:“健康与人类发展学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1923”
},
{
“学院”:[],
“部门”:[
28,
29,
32,
48
],
“普通课程”:[],
“id”:6,
“名称”:“人文社会科学学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1924”
},
{
“学院”:[],
“部门”:[
52,
57
],
“普通课程”:[],
“id”:7,
“名称”:“自然科学与数学学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1925”
},
{
“学院”:[],
“部门”:[
58,
59,
63
],
“普通课程”:[],
“id”:8,
“名称”:“米哈伊洛商业与经济学院”,
“短名称”:“,
“url”:“/content.php?catoid=16&navoid=1926”
}
]
}
步骤1-将其解析为节点:
let colleges = JSON.parse(data)
步骤2-将其保存到dialogflow应用程序数据中:
app.data.collegeData = data;
步骤3-访问长度:
let collegeLength = Object.keys(app.data.collegeData.college).length;
在firebase控制台中获取以下错误:
TypeError:无法将未定义或null转换为对象
更新:
代码如下:
if(app.data.collegeData==未定义){
app.data.collegeData=[];
}
**步骤1=>**
表演学院(学院);
**步骤2=>**
功能展示学院(学院名称){
如果(app.data.collegeData.length==0){
getCollegeData().then(buildSingleCollegeResponse(collegeName))
.catch(函数(err){
console.log('没有学院数据')
console.log(错误)
});
}
否则{
构建单一的CollegeResponse(collegeName);
}
}
**步骤3=>**
函数getCollegeData(){
console.log('内部获取学院数据')
返回请求API(URL)
.then(功能(数据){
let=JSON.parse(数据)
if(学院拥有自己的财产(“学院”)){
保存数据(学院)
}
返回null;
})
.catch(函数(err){
console.log('没有学院数据')
console.log(错误)
});
}
**步骤4=>**
函数saveData(数据){
app.data.collegeData=数据;
console.log(app.data.collegeData)
}
**步骤5=>**
函数buildSingleCollegerResponse(collegeName){
让用户、文本响应;
//log('Data is->'+Object.keys(app.Data.collegeData.college).length);
//log('Length is->'+app.data.collegeData.college.Length);
console.log('计数为->'+app.data.collegeCount);
让collegeLength=Object.keys(app.data.collegeData.college).length;
如果(collegeLength==0){
responseToUser='目前没有学院';
text='目前没有学院';
}
否则如果(app.data.collegeCount 对于(var i=1;i在发布app.data.collegeData=data;
如果app.data
未定义,则应尝试app.data={collegeData:data}
或者否定什么应用程序商店。下面的工作
app = {};
app.data = {};
app.data.collegeData = data;
app.data.collegeData.college.length
您不需要执行以下操作
let collegeLength = Object.keys(app.data.collegeData.college).length;
更新:请参阅这是罪魁祸首:
getCollegeData().then(buildSingleCollegeResponse(collegeName))
调用buildSingleCollegerResponse(collegeName)
,然后将其返回值传递到然后
,就像foo(bar())
调用bar
并将其返回值传递到foo
您想将函数传递给,然后
:
getCollegeData().then(() => buildSingleCollegeResponse(collegeName))
// An arrow function ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
请注意,从更新的问题中可以清楚地看出,app.data.collegeData.college
是一个数组,因此不需要使用Object.keys
。更改:
let collegeLength = Object.keys(app.data.collegeData.college).length;
简单地
let collegeLength = app.data.collegeData.college.length;
数组有一个length
属性(而非数组对象默认没有)。第一步:让colleges=JSON.parse(data)
然后第二步:app.data.collegeData=data;
不应该是=colleges
?数据仍然是字符串(JSON),但你想处理大学中的实际数据(这不是JSON,因为它不是字符串)。投票以打字错误/不重复/以后没有用的方式结束,因为如果你纠正了上面的简单错误,它会起作用:谢谢!更新了我的问题。如果有帮助,发布了更多的代码。Th