将JSON数组传递给实现文本

问题描述 投票:0回答:1

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

JSONarray = 
[ { name: 'Steven' },
  { name: 'Clark' },
  { name: 'Kensington' } ]

关于dialogflow和Google助手,我需要发送一个类似于以下内容的webhook响应...

"fulfillmentText": JSONarray}),
  "fulfillmentMessages" : [
          {
            "text":
              {"text": [JSONarray]
            }
          }
        ]}

我遇到的问题是这段“ fulfillmentText”:JSONarray。 “ fulfillmentText”是Google助理回读的部分,理想情况下,我希望它回读三个名称中的每个名称,但是如果我只是传递数组,它将失败。是否可以构建可以使这种情况发生的JSON?

dialogflow actions-on-google dialogflow-fulfillment
1个回答
0
投票

首先,是次要的语义要点。那不是“ 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}`;
© www.soinside.com 2019 - 2024. All rights reserved.