2017-02-05 4 views
0

я получаю объект JSON с некоторым количеством быстрых элементов ответа от wit.ai, как это:как построить массив JSON динамически в JavaScript

"msg": "So glad to have you back. What do you want me to do? 
 
"action_id": "6fd7f2bd-db67-46d2-8742-ec160d9261c1", 
 
"confidence": 0.08098269709064443, 
 
"quickreplies": [ 
 
    "News?", 
 
    "Subscribe?", 
 
    "Contribute?", 
 
    "Organize?" 
 
], 
 
"type": "msg"

Я тогда нужно преобразовать их в несколько иной формат, поскольку они передаются FaceBook Messenger, как описано в приведенном ниже коде. Уит раскрывает только «msg» и «quickreplies». Можете ли вы предложить хороший способ сделать это? Это происходит после «console.log (element)», насколько я понимаю.

 if (quickreplies){ 
 
     // got simple array of quickreplies 
 
     // need to format quickreplies for FB: 
 
            // "quick_replies":[ 
 
            //  { 
 
            //  "content_type":"text", 
 
            //  "title":"Red", 
 
            //  "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_RED" 
 
            //  }, 
 
            //  { 
 
            //  "content_type":"text", 
 
            //  "title":"Green", 
 
            //  "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_GREEN" 
 
            //  } 
 
     console.log('we got quickreplies, here they are:'); 
 
     var quick_replies = []; // ?? 
 
     quickreplies.forEach(function(element) { 
 
      console.log(element) 
 

 
     }); 
 
     } 
 
     else (console.log('no quickreplies'));       

В приведенном выше примере, конечный результат должен быть таким:

"recipient":{ 
 
    "id":"USER_ID" 
 
    }, 
 
    "message":{ 
 
    "text":"Pick a color:", 
 
    "quick_replies":[ 
 
     { 
 
     "content_type":"text", 
 
     "title":"Red", 
 
     "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_RED" 
 
     }, 
 
     { 
 
     "content_type":"text", 
 
     "title":"Green", 
 
     "payload":"DEVELOPER_DEFINED_PAYLOAD_FOR_PICKING_GREEN" 
 
     } 
 
    ] 
 
    }

+0

Что формат быстрого ответа от 'wit.ai?' Вы пробовали конвертировать один формат в FB? 'var quick_replies = quickreplies.map (conversionFunction)' может быть лучше, чем '.forEach' – traktor53

+0

Если я прочитал его правильно, это преобразование является частью подготовки объекта сообщения, чье свойство text будет« welcom back .... »и будет содержат массив 'quick_replies'. Каждый объект 'quick_reply' будет иметь заголовок, такой как« подписаться »и полезная нагрузка _, который будет возвращен в качестве метаданных при получении ответа в разговоре. Следующий шаг - решить, какие метаданные должны быть для каждого действия, основываясь на том, как вы собираетесь сообщить боту, что такое ответ. – traktor53

+0

Да. Но на этом этапе я был бы очень рад просто увидеть, как быстрые ответы появляются как кнопки на бот-сервере FB. Для этого мне нужно только правильно отформатировать его и отправить в FB. – Jerome

ответ

1

Я не уверен, если это было конечно путаницы , но нет такой вещи, как «объект JSON». Один работает с объектами данных, возвращаемыми JSON.parse, таким же образом, как и с любым другим объектом. Перед отправкой в ​​FB, конечно, объекты данных должны быть преобразованы в формат строки JSON с использованием JSON.stringify. Это может быть происходит автоматически в некоторых библиотеках кода в зависимости от того, как данные отправляются.

Вот пример подготовки массива quick-replies. Я просто выбрал пример структуры для полезной нагрузки и пошел с ней. Массив quick_replies по-прежнему является объектом и не был преобразован в строку JSON.

Редактировать Формат текстовой полезной нагрузки, показанной в первом text only example for quick replies, указывает, что полезная нагрузка представляет собой строку. Приведенный ниже код был обновлен, чтобы соответствовать этому требованию.

// test values for quickreplies: 
 

 
var quickreplies= [ "News?", "Subscribe?", "Contribute?", "Organize?" ]; 
 

 
/******** 
 

 
    convert quickreplies to quick_replies array 
 
    using an example payload of: 
 

 
    { "text" : "text string",  // button text 
 
     "index" : index,    // index into quickreply for button 
 
     "other": "tbd"    // anything else needed in a reply 
 
    } 
 

 
*********/ 
 
var quick_replies; 
 
if (quickreplies) { 
 
    console.log('we got quickreplies, here they are:'); 
 
    quick_replies = quickreplies.map(function(element, index) { 
 

 
     var payload = { 
 
       text: element, 
 
       index: index, 
 
       other: "tbd" // example value only. 
 
     }; 
 
     var payloadString = JSON.stringify(payload); 
 
     console.log(element); 
 
     var quick_reply = { 
 
      content_type: "text", 
 
      title: element, 
 
      payload: payloadString 
 
     }; 
 
     console.log("** converted to : " + JSON.stringify(quick_reply)); 
 
    }); 
 
    quickreplies=null; // housekeeping 
 
} 
 
else { 
 
    console.log('no quickreplies'); 
 
    quick_replies = undefined; // or [] ? 
 
}

+0

action_id не определен, но если он закомментирован, этот код работает. – Jerome

+0

он работает на первом проходе, но после этого выходит из строя, похоже, проблема с домашним хозяйством – Jerome

+0

отредактировал ваш код выше, добавлен домохозяйство, работает до сих пор – Jerome

Смежные вопросы