Передача массива JSON в executementText - PullRequest
0 голосов
/ 05 марта 2020

У меня есть массив JSON объектов, который выглядит следующим образом ...

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

Что касается диалогового процесса и помощника Google, мне нужно отправить ответ webhook, который выглядит примерно так ... .

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

Проблема, с которой я столкнулся, заключается в следующем фрагменте "executementText": JSONarray. «executementText» - это часть, которую Google Assistant считывает обратно, и в идеале я хочу, чтобы он считывал каждое из трех имен, но если я просто передам массив, произойдет сбой. Могу ли я построить JSON, который позволит этому случиться?

1 Ответ

1 голос
/ 06 марта 2020

Сначала небольшая семанти c балл. Это не "JSON Array". Это массив JavaScript объектов. JSON относится к строковому представлению этих объектов (JavaScript Обозначение объекта).

Это важно, потому что "executementText" ожидает строку. Вы можете превратить JavaScript объекты в строку, используя метод JSON.stringify(), так что вы будете делать что-то вроде

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}`;
...