使用 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将没有消息对象。 来自 的其他来源推荐了此功能

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;那个提问者对做那种守卫不满意。