簡體   English   中英

如何在 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 中提供的相同的自定義有效負載結構?

提前謝謝你。

編輯:顯然 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);

這是使用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)

有同樣的問題,這是非常可怕和痛苦的,這些添加的 k,v 我們在我們的服務器中作為 webhooks 收到,這是非常糟糕和痛苦的,這是因為我使用NodeJS 的 structJson ,這是我找到的一個解決方案:

 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 響應中的 dsired 元素,其中有效負載為:Response_dialogflow.fulfillmentMessages[0]... 或1 ...

您現在可以使用pb-util將 protobuf 轉換為 node.js 中的 JavaScript 對象。 根據nodejs-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 對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM