如何反序列化 Dialogflow v2 中的自定义负载响应?
How to deserialize custom payload response in Dialogflow v2?
我正在使用 Dialogflow v2 和 Node.js 客户端 SDK 为 Messenger 开发自己的聊天机器人。但我对自定义有效载荷有疑问。当我使用 Dialogflow 提供的控制台时,我得到的响应如下所示:
{ "payload": { "facebook": { "attachment": { "payload": { ...
但是,当我从我的 JS 服务器收到响应时,自定义负载已经序列化。这是我收到的对象:
{ facebook: { structValue: { fields: [Object] }, kind: 'structValue' } }
是否可以反序列化此对象以获得我在 Dialogflow 中提供的相同自定义负载结构?
提前谢谢你。
这是使用 Struct protocols
构建的
为了进行转换,您需要使用 google 原型缓冲区,即 google.protobuf
我使用下面的代码来做到这一点。
import google.protobuf as pf
pf.json_format.MessageToJson(response.query_result.fulfillment_messages[1].payload, including_default_value_fields=False)
编辑:显然 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);
有同样的问题,我们在服务器中作为 webhooks 收到的这些添加的 k、v 很无聊,这是非常糟糕和痛苦的,这是因为 structJson我使用 NodeJS,这是我找到的解决方案:
const JSON_SIMPLE_VALUE_KINDS = new Set([
'numberValue',
'stringValue',
'boolValue',
]);
function valueProtoToJson(proto) {
if (!proto || !proto.kind) {
return null;
}
if (JSON_SIMPLE_VALUE_KINDS.has(proto.kind)) {
return proto[proto.kind];
} else if (proto.kind === 'nullValue') {
return null;
} else if (proto.kind === 'listValue') {
if (!proto.listValue || !proto.listValue.values) {
console.warn('Invalid JSON list value proto: ', JSON.stringify(proto));
}
return proto.listValue.values.map(valueProtoToJson);
} else if (proto.kind === 'structValue') {
return structProtoToJson(proto.structValue);
} else {
console.warn('Unsupported JSON value proto kind: ', proto.kind);
return null;
}
}
function structProtoToJson(proto) {
if (!proto || !proto.fields) {
return {};
}
const json = {};
for (const k in proto.fields) {
json[k] = valueProtoToJson(proto.fields[k]);
}
return json;
}
Once added, you apply this function to your result :
var correctJSON = valueProtoToJson(Response_dialogflow.fulfillmentMessages[0].payload.fields.facebook)
您只需将 valueProtoToJson 函数应用于 Dialogflow 响应中的所需元素,其中有效负载为:Response_dialogflow.fulfillmentMessages[0 ]...或1...
您现在可以使用 pb-util
for converting from protobuf to JavaScript objects in node. According to this comment on nodejs-dialogflow
,这是一个临时解决方案,直到它被包含在客户端库中。
我如何解码 dialogflow
我的 API 对(dialogflow webhook 实现请求)
的响应格式
const response = {
"status":200,
"messages":[{},{} ...]
}
我如何阅读我的 API 的回复以发送聊天机器人或做某事..
var express = require('express');
var {value} = require('pb-util');
var router = express.Router();
...
const status = value.decode(data[0].queryResult.webhookPayload.fields.status);
const messages = value.decode(data[0].queryResult.webhookPayload.fields.messages);
pb-util 将我的状态和消息转换为正常的 JSON 对象
我正在使用 Dialogflow v2 和 Node.js 客户端 SDK 为 Messenger 开发自己的聊天机器人。但我对自定义有效载荷有疑问。当我使用 Dialogflow 提供的控制台时,我得到的响应如下所示:
{ "payload": { "facebook": { "attachment": { "payload": { ...
但是,当我从我的 JS 服务器收到响应时,自定义负载已经序列化。这是我收到的对象:
{ facebook: { structValue: { fields: [Object] }, kind: 'structValue' } }
是否可以反序列化此对象以获得我在 Dialogflow 中提供的相同自定义负载结构?
提前谢谢你。
这是使用 Struct protocols
构建的为了进行转换,您需要使用 google 原型缓冲区,即 google.protobuf 我使用下面的代码来做到这一点。
import google.protobuf as pf
pf.json_format.MessageToJson(response.query_result.fulfillment_messages[1].payload, including_default_value_fields=False)
编辑:显然 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);
有同样的问题,我们在服务器中作为 webhooks 收到的这些添加的 k、v 很无聊,这是非常糟糕和痛苦的,这是因为 structJson我使用 NodeJS,这是我找到的解决方案:
const JSON_SIMPLE_VALUE_KINDS = new Set([
'numberValue',
'stringValue',
'boolValue',
]);
function valueProtoToJson(proto) {
if (!proto || !proto.kind) {
return null;
}
if (JSON_SIMPLE_VALUE_KINDS.has(proto.kind)) {
return proto[proto.kind];
} else if (proto.kind === 'nullValue') {
return null;
} else if (proto.kind === 'listValue') {
if (!proto.listValue || !proto.listValue.values) {
console.warn('Invalid JSON list value proto: ', JSON.stringify(proto));
}
return proto.listValue.values.map(valueProtoToJson);
} else if (proto.kind === 'structValue') {
return structProtoToJson(proto.structValue);
} else {
console.warn('Unsupported JSON value proto kind: ', proto.kind);
return null;
}
}
function structProtoToJson(proto) {
if (!proto || !proto.fields) {
return {};
}
const json = {};
for (const k in proto.fields) {
json[k] = valueProtoToJson(proto.fields[k]);
}
return json;
}
Once added, you apply this function to your result :
var correctJSON = valueProtoToJson(Response_dialogflow.fulfillmentMessages[0].payload.fields.facebook)
您只需将 valueProtoToJson 函数应用于 Dialogflow 响应中的所需元素,其中有效负载为:Response_dialogflow.fulfillmentMessages[0 ]...或1...
您现在可以使用 pb-util
for converting from protobuf to JavaScript objects in node. According to this comment on nodejs-dialogflow
,这是一个临时解决方案,直到它被包含在客户端库中。
我如何解码 dialogflow
我的 API 对(dialogflow webhook 实现请求)
的响应格式const response = {
"status":200,
"messages":[{},{} ...]
}
我如何阅读我的 API 的回复以发送聊天机器人或做某事..
var express = require('express');
var {value} = require('pb-util');
var router = express.Router();
...
const status = value.decode(data[0].queryResult.webhookPayload.fields.status);
const messages = value.decode(data[0].queryResult.webhookPayload.fields.messages);
pb-util 将我的状态和消息转换为正常的 JSON 对象