使用 Google Apps 脚本访问 JSON 中的未定义对象
Accessing undefined objects in JSON with Google Apps Script
我正在处理一个电报机器人项目,我需要确定我收到的 JSON
文件的类型。
例如,一条消息将包含:
{
"update_id": 12345,
"message": {
"message_id": 123,
"from": {
"id": 123456,
"is_bot": false,
"first_name": "John",
"last_name": "Tan",
"username": "John123",
"language_code": "en-SG"
},
"chat": {
"id": 123456,
"first_name": "John",
"last_name": "Tan",
"username": "John123",
"type": "private"
},
"date": 1533567761,
"text": "/start",
"entities": [
{
"offset": 0,
"length": 6,
"type": "bot_command"
}
]
}
}
由此我知道 message.message_id
存在。在这种情况下:
if (e.postData.contents.message.message_id) {
// would run fine
}
但是,其他类型的JSON
将没有消息对象。
来自 javascript 的其他来源推荐了此功能
function isMsg(fn) {
try {
fn;
return true;
} catch(e) {
return false;
}
}
但是,似乎 Google Apps 脚本会在我 运行 这个函数之前抛出一个 TypeError
。我 运行 是这样的:
if (ifMsg(e.postData.contents.message.message_id)) {
// exception
}
{
"message": "Cannot read property \"message_id\" from undefined.",
"name": "TypeError"
}
有人有其他解决方法吗?
编辑:T.J. Crowder 在下面回答了我的问题。这个想法是,如果还缺少更高级别的对象,则需要 "guard" 。为了防止 typeError: Cannot read "something" from undefined,使用:
if(level1 && level1.level2 && level1.level2.level3){
//should run fine
}
就我而言,这对我有用:
if(contents && contents.message && contents.message.message_id){
//runs fine
}
这适用于我的情况,因为内容始终存在。我发现它解决了我的问题。
你会像这样使用守卫:
if (e.postData.contents.message && e.postData.contents.message.message_id) {
另见this question's answers;那个提问者对做那种守卫不满意。
我正在处理一个电报机器人项目,我需要确定我收到的 JSON
文件的类型。
例如,一条消息将包含:
{
"update_id": 12345,
"message": {
"message_id": 123,
"from": {
"id": 123456,
"is_bot": false,
"first_name": "John",
"last_name": "Tan",
"username": "John123",
"language_code": "en-SG"
},
"chat": {
"id": 123456,
"first_name": "John",
"last_name": "Tan",
"username": "John123",
"type": "private"
},
"date": 1533567761,
"text": "/start",
"entities": [
{
"offset": 0,
"length": 6,
"type": "bot_command"
}
]
}
}
由此我知道 message.message_id
存在。在这种情况下:
if (e.postData.contents.message.message_id) {
// would run fine
}
但是,其他类型的JSON
将没有消息对象。
来自 javascript 的其他来源推荐了此功能
function isMsg(fn) {
try {
fn;
return true;
} catch(e) {
return false;
}
}
但是,似乎 Google Apps 脚本会在我 运行 这个函数之前抛出一个 TypeError
。我 运行 是这样的:
if (ifMsg(e.postData.contents.message.message_id)) {
// exception
}
{
"message": "Cannot read property \"message_id\" from undefined.",
"name": "TypeError"
}
有人有其他解决方法吗?
编辑:T.J. Crowder 在下面回答了我的问题。这个想法是,如果还缺少更高级别的对象,则需要 "guard" 。为了防止 typeError: Cannot read "something" from undefined,使用:
if(level1 && level1.level2 && level1.level2.level3){
//should run fine
}
就我而言,这对我有用:
if(contents && contents.message && contents.message.message_id){
//runs fine
}
这适用于我的情况,因为内容始终存在。我发现它解决了我的问题。
你会像这样使用守卫:
if (e.postData.contents.message && e.postData.contents.message.message_id) {
另见this question's answers;那个提问者对做那种守卫不满意。