如何在Dialogflow v2中反序列化自定义有效负载响应?

MrO*_*iri 5 chatbot facebook-messenger dialogflow-es

我正在使用Dialogflow v2和Node.js客户端SDK开发用于Messenger的聊天机器人。但是我对自定义有效载荷有疑问。当我使用Dialogflow提供的控制台时,我收到如下响应:

{ "payload": { "facebook": { "attachment": { "payload": { ...
Run Code Online (Sandbox Code Playgroud)

但是,当我从JS服务器获得响应时,自定义有效负载已被序列化。这是我收到的对象:

{ facebook: { structValue: { fields: [Object] }, kind: 'structValue' } }
Run Code Online (Sandbox Code Playgroud)

是否可以反序列化此对象以获得与Dialogflow中提供的相同的自定义有效负载结构?

先感谢您。

JDK*_*JDK 5

编辑:显然 Dialogflow 发布了自己的解决方案以及 Node.js SDK 的示例: dialogflow-nodejs-client-v2/samples/structjson.js

除了 Vikas Jain 的解决方案之外,您还可以编写自己的(递归)转换函数。

就像是:

processCustomPayloadMessage(object) {
  let outputMessage = Array.isArray(object) ? [] : {};
  Object.entries(object).forEach(([key, value]) => {
    if (value.kind == 'structValue') {
      outputMessage[key] = this.processCustomPayloadMessage(value.structValue.fields);
    } else if (value.kind == 'listValue') {
      outputMessage[key] = this.processCustomPayloadMessage(value.listValue.values);
    } else if (value.kind == 'stringValue') {
      outputMessage[key] = value.stringValue;
    } else if (value.kind == 'boolValue') {
      outputMessage[key] = value.boolValue;
    } else {
      outputMessage[key] = value;
    }
  });
  return outputMessage;
}

// call this method with your response message
this.processCustomPayloadMessage(message.payload.fields);
Run Code Online (Sandbox Code Playgroud)


小智 4

这是使用Struct 协议构建的

为了进行转换,您需要使用 google proto 缓冲区,即google.protobuf 我使用下面的代码来执行此操作。

import google.protobuf  as pf
pf.json_format.MessageToJson(response.query_result.fulfillment_messages[1].payload, including_default_value_fields=False)
Run Code Online (Sandbox Code Playgroud)