Dialogflow es 将JSON数组传递给fulfillmentText

Dialogflow es 将JSON数组传递给fulfillmentText,dialogflow-es,actions-on-google,dialogflow-es-fulfillment,Dialogflow Es,Actions On Google,Dialogflow Es Fulfillment,我有一个JSON对象数组,看起来像这样 JSONarray = [ { name: 'Steven' }, { name: 'Clark' }, { name: 'Kensington' } ] "fulfillmentText": JSONarray}), "fulfillmentMessages" : [ { "text": {"text": [JSONarray] }

我有一个JSON对象数组,看起来像这样

JSONarray = 
[ { name: 'Steven' },
  { name: 'Clark' },
  { name: 'Kensington' } ]
"fulfillmentText": JSONarray}),
  "fulfillmentMessages" : [
          {
            "text":
              {"text": [JSONarray]
            }
          }
        ]}
关于dialogflow和GoogleAssistant,我需要发送一个webhook响应,看起来像这样

JSONarray = 
[ { name: 'Steven' },
  { name: 'Clark' },
  { name: 'Kensington' } ]
"fulfillmentText": JSONarray}),
  "fulfillmentMessages" : [
          {
            "text":
              {"text": [JSONarray]
            }
          }
        ]}

我的问题是这篇文章“fulfillmentText”:JSONarray“fulfillmentText”是Google助手读回的部分,理想情况下,我希望让它读回三个名称中的每一个,但如果我只是通过数组,它就会失败。我是否可以构建JSON来实现这一点?

首先,一个次要的语义点。这不是一个“JSON数组”。它是一个JavaScript对象数组。JSON是指这些对象的字符串表示(JavaScript对象表示法)

这很重要,因为“fullymenttext”需要一个字符串。您可以使用
JSON.stringify()
方法将JavaScript对象转换为字符串,因此您可以执行以下操作

const text = JSON.stringify( JSONarray );
然而,这可能不是你想要的,因为助手会这样读出来

const text = JSON.stringify( JSONarray );
左括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右括号右

等等

相反,您可能应该编写一个函数,将数组转换为字符串。简单地说,您可以仅对名称的值调用
join()
。大概是这样的:

const names = JSONarray.map( o => o.name );  // Gets just an array of the names
const namesString = names.join(', ');  // Joins them into a single string, separated by commas
const text = `The names are: ${namesString}`;
这是更好的,并且将被读出的内容类似于

const text = JSON.stringify( JSONarray );
名字是史蒂文,克拉克,肯辛顿

但人们实际上并不是这样读(或听)名字的。我们希望它更像

他们的名字是史蒂文、克拉克和肯辛顿

这是非常常见的,包括一个模板函数来根据字符串列表执行此操作。因此,您的模板将类似于:

"The names are: {{Oxford names}}"
如果您不使用多声道,类似这样的方法会起作用:

/**
 * Similar to Array.join(), but using rules for the Oxford comma.
 * @param values The array to return joined values for
 * @param sep1 The normal separator for each element (defaults to ", ")
 * @param sep2 The separator before the final element (defaults to "and ")
 * @returns {*}
 */
function oxford( values, sep1=", ", sep2="and " ){
  if( !Array.isArray( values ) ){
    return values;
  } else if( values.length === 0 ){
    return '';
  } else if( values.length === 1 ){
    return values[0];
  } else if( values.length === 2 ){
    return values[0]+' '+sep2+values[1];
  }

  var ret = '';

  for( var co=0; co<values.length-1; co++ ){
    ret += values[co]+sep1;
  }
  ret += sep2;
  ret += values[values.length-1];

  return ret;
};

const namesString = oxford( names );
const text = `The names are: ${namesString}`;
/**
*类似于Array.join(),但使用牛津逗号规则。
*@param values要为其返回联接值的数组
*@param sep1每个元素的标准分隔符(默认为“,”)
*@param sep2最后一个元素前的分隔符(默认为“and”)
*@returns{*}
*/
函数(值,sep1=“,”,sep2=“和”){
如果(!Array.isArray(值)){
返回值;
}else if(values.length==0){
返回“”;
}else if(values.length==1){
返回值[0];
}else if(values.length==2){
返回值[0]+“”+sep2+值[1];
}
var-ret='';
对于(var co=0;co