我有一个看起来像这样的JSON对象数组...
JSONarray =
[ { name: 'Steven' },
{ name: 'Clark' },
{ name: 'Kensington' } ]
关于dialogflow和Google助手,我需要发送一个类似于以下内容的webhook响应...
"fulfillmentText": JSONarray}),
"fulfillmentMessages" : [
{
"text":
{"text": [JSONarray]
}
}
]}
我遇到的问题是这段“ fulfillmentText”:JSONarray。 “ fulfillmentText”是Google助理回读的部分,理想情况下,我希望它回读三个名称中的每个名称,但是如果我只是传递数组,它将失败。是否可以构建可以使这种情况发生的JSON?
首先,是次要的语义要点。那不是“ JSON数组”。它是一个JavaScript对象数组。 JSON表示这些对象的字符串表示形式(JavaScript对象表示法)。
这很重要,因为“ fulfillmentText”需要一个字符串。您可以使用JSON.stringify()
方法将JavaScript对象转换为字符串,因此您可以执行以下操作:
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}`;
这更好,读出的内容类似
名字是史蒂文,克拉克,肯辛顿
但是这不是人们实际阅读(或收听)名字的方式。我们希望它更像是
名字是史蒂文,克拉克和肯辛顿
这很常见,以至multivocal包括一个基于字符串列表执行此操作的模板函数。因此,您的模板将类似于:
"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}`;