【问题标题】:how to build json array dynamically in javascript如何在javascript中动态构建json数组
【发布时间】:2017-02-05 22:12:53
【问题描述】:

我从 wit.ai 收到一个带有一些快速回复元素的 json 对象,如下所示:

 "msg": "So glad to have you back.  What do you want me to do?  
 "action_id": "6fd7f2bd-db67-46d2-8742-ec160d9261c1",
 "confidence": 0.08098269709064443,
 "quickreplies": [
   "News?",
   "Subscribe?",
   "Contribute?",
   "Organize?"
 ],
 "type": "msg"

然后我需要将它们转换为稍微不同的格式,因为它们被传递到 FaceBook Messenger,如下面的代码中所述。 Wit 只公开“msg”和“quickreplies”。你能提出一个好的方法来做到这一点吗?据我了解,它在“console.log(element)”之后。

      if (quickreplies){
        // got simple array of quickreplies
        // need to format quickreplies for FB:
                                  //  "quick_replies":[
                                  //     {
                                  //       "content_type":"text",
                                  //       "title":"Red",
                                  //       "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_RED"
                                  //     },
                                  //     {
                                  //       "content_type":"text",
                                  //       "title":"Green",
                                  //       "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_GREEN"
                                  //     }
        console.log('we got quickreplies, here they are:');
        var quick_replies = []; // ??
        quickreplies.forEach(function(element) {
          console.log(element)

        });
      }
      else (console.log('no quickreplies'));                               

在上面的例子中,最终结果应该是这样的:

 "recipient":{
    "id":"USER_ID"
  },
  "message":{
    "text":"Pick a color:",
    "quick_replies":[
      {
        "content_type":"text",
        "title":"Red",
        "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_RED"
      },
      {
        "content_type":"text",
        "title":"Green",
        "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_GREEN"
      }
    ]
  }

【问题讨论】:

  • wit.ai?的快速回复是什么格式你有没有试过把一个转成FB格式? var quick_replies=quickreplies.map( conversionFunction) 可能比 .forEach 更好
  • 如果我没看错的话,这个转换是准备一个消息对象的一部分,它的文本属性是“welcom back ....”并且包含一个quick_replies数组。每个quick_reply 对象都将有一个标题,例如“订阅”和一个有效负载将在收到对话回复时作为元数据返回。下一步是根据您将如何告诉机器人响应是什么来决定每个操作需要的元数据。
  • 是的。但在这个阶段,我很高兴看到快速回复显示为 FB 机器人上的按钮。为此,我只需要正确格式化并将其发送到 FB。

标签: javascript node.js facebook nlp wit.ai


【解决方案1】:

我不确定这是否是一个混乱的过程,但没有“JSON 对象”这样的东西。一种处理JSON.parse 返回的数据对象的方式与处理任何其他对象的方式相同。当然,在发送到 FB 之前,数据对象必须使用JSON.stringify 转换为 JSON 字符串格式。这可能在某些代码库中自动发生,具体取决于数据的发送方式。

这是一个准备 quick-replies 数组的示例 - 我只是为有效负载选择了一个示例结构并使用它。 quick_replies 数组仍然是一个对象,尚未转换为 JSON 字符串。

编辑纯文本payload的格式,如第一个text only example for quick replies所示,表示payload是一个字符串。以下代码已更新以满足此要求。

// test values for quickreplies:

var quickreplies= [ "News?", "Subscribe?", "Contribute?", "Organize?" ];

/********

     convert quickreplies to quick_replies array
     using an example payload of:

     { "text" : "text string",       // button text
       "index" : index,              // index into quickreply for button
       "other": "tbd"                // anything else needed in a reply
     }

*********/
var quick_replies;
if (quickreplies) {
    console.log('we got quickreplies, here they are:');
    quick_replies = quickreplies.map( function(element, index) {

        var payload = {
                text: element,
                index: index,
                other: "tbd"    // example value only.
        };
        var payloadString = JSON.stringify( payload);
        console.log(element);
        var quick_reply = {
            content_type: "text",
            title: element,
            payload: payloadString
        };
        console.log("** converted to : " + JSON.stringify(quick_reply));
    });
    quickreplies=null; // housekeeping
}
else {
    console.log('no quickreplies');
    quick_replies = undefined; // or [] ?
}

【讨论】:

  • action_id 未定义,但如果注释掉,此代码有效。
  • 它在第一次通过但之后失败,看起来像家务问题
  • 在上面编辑了您的代码,添加了内务管理,目前运行良好
  • 编辑接受了两项更改:将 action_id 替换为 other 并将 quickreplies 的内务重置移动到 map 函数之外。例如,整个有效负载结构应进行修改以满足您在回复中的要求。
  • 我不确定您为什么要以这种方式构建有效负载。当用户按下快速回复按钮时,我想我的机器人会取回有效载荷,所以我可以适应有效载荷中的任何内容,只要它增加价值。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2020-07-23
  • 1970-01-01
相关资源
最近更新 更多