Не удалось разобрать ответ Dialogflow в AppResponse - PullRequest
0 голосов
/ 25 ноября 2018

У меня проблема при выполнении карты массива до conv.ask.Я получаю ошибку, связанную с искаженным объектом JSON, но, насколько я могу судить, должно быть действительным.

const timetableCells = timetable.Trains.map((item) => {
  return {
    cells: [item.Line, item.Destination, item.Car, item.Min],
  }
})

conv.ask(new Table({
  title: `Rail Timetable for ${station}`,
  subtitle: 'Timetable as of x date',
  image: new Image({
    url: 'http://google.com/image.png',
    alt: 'Logo'
  }),
  columns: [
    {
      header: 'Line',
      align: 'LEADING'
    },
    {
      header: 'Destination',
      align: 'LEADING'
    },
    {
      header: 'Car',
      align: 'LEADING'
    },
    {
      header: 'Arrival',
      align: 'LEADING'
    },
  ],
  rows: timetableCells,
  buttons: new Button({
    title: 'Button Title',
    url: 'https://github.com/actions-on-google'
  })
}))

Вот как выглядит timetable:

{"Trains":[{"Car":"8","Destination":"Glenmont","DestinationCode":"B11","DestinationName":"Glenmont","Group":"1","Line":"RD","LocationCode":"B09","LocationName":"Forest Glen","Min":"9"},{"Car":"8","Destination":"Glenmont","DestinationCode":"B11","DestinationName":"Glenmont","Group":"1","Line":"RD","LocationCode":"B09","LocationName":"Forest Glen","Min":"18"},{"Car":"8","Destination":"Glenmont","DestinationCode":"B11","DestinationName":"Glenmont","Group":"1","Line":"RD","LocationCode":"B09","LocationName":"Forest Glen","Min":"36"},{"Car":"8","Destination":"Shady Gr","DestinationCode":"A15","DestinationName":"Shady Grove","Group":"2","Line":"RD","LocationCode":"B09","LocationName":"Forest Glen","Min":""}]}

Если я регистрирую timetableCells, у меня есть массив, который выглядит следующим образом, и я присваиваю его rows внутри conv.ask, что должно быть равным ожидаемому Google Assistant в соответствии с их документацией .

[ { cells: ['1', '2', '3', '4'] }, { cells: ['1', '2', '3', '4'] } ]

Если я преобразую в строку объект JSON, я передаю conv.ask это выглядит правильно:

JSON.parse("{\"title\":\"Rail Timetable for Farragut North\",\"subtitle\":\"Timetable as of x date\",\"columns\":[{\"header\":\"Line\",\"align\":\"LEADING\"},{\"header\":\"Destination\",\"align\":\"LEADING\"},{\"header\":\"Car\",\"align\":\"LEADING\"},{\"header\":\"Arrival\",\"align\":\"LEADING\"}],\"rows\":[{\"cells\":[\"RD\",\"Glenmont\",\"8\",\"\"]},{\"cells\":[\"RD\",\"Shady Gr\",\"8\",\"\"]}]}")

Где я здесь не так?Я знаю, что именно эта строка вызывает проблему, поскольку я могу заменить ее, и она работает правильно.Отладчик указывает на ошибку проверки JSON, но я не вижу ее.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Мне потребовалось очень много времени, чтобы понять, и странно, что здесь не возникла другая ошибка.Было очевидно, что данные в строках должны соответствовать количеству заголовков в таблице, однако не очевидно, что строки не могут быть пустыми, в противном случае вы получите ошибку синтаксического анализа.

Были случаи, когда некоторые значения возвращались в виде пустых строк из моего ответа API, что вызывало проблему.Изменение кода на следующий исправило проблему, поскольку это гарантирует, что они никогда не будут пустыми строками.

const timetableCells = timetable.Trains.map((item) => {
  return {
    cells: [item.Line || "N/A", item.Destination || "N/A", item.Car || "TBD", item.Min || "TDB"],
  }
})
0 голосов
/ 25 ноября 2018

Я только что решил очень похожую проблему.Массив, который вы назначаете для строк и ячеек, должен содержать только Strings .В ситуации, когда это числа, произойдет «не удалось разобрать ответ DialogFlow int AppResponse».

...