2017-06-17 108 views
0

我正在使用Node JS應用測試facebook leadgen api。 使用Facebook測試工具,我得到了Facebook的回覆。當我嘗試JSON.stringify()時,我得到了將循環結構轉換爲JSON錯誤。我如何獲得領域領導的價值。如何解析來自facebook leadgen api的循環JSON響應?

測試數據從Facebook:

  { 
       "field": "leadgen", 
       "value": { 
       "ad_id": "444444444", 
       "form_id": "444444444444", 
       "leadgen_id": "444444444444", 
       "created_time": 1497678903, 
       "page_id": "444444444444", 
       "adgroup_id": "44444444444" 
       } 
      } 

我試着使用打印日誌中的響應。但反應看起來像這樣。我無法理解如何解析它。

ServerResponse { 
     domain: null, 
     _events: { finish: [Function: resOnFinish] }, 
     _eventsCount: 1, 
     _maxListeners: undefined, 
     output: [], 
     outputEncodings: [], 
     outputCallbacks: [], 
     outputSize: 0, 
     writable: true, 
     _last: false, 
     upgrading: false, 
     chunkedEncoding: false, 
     shouldKeepAlive: false, 
     useChunkedEncodingByDefault: false, 
     sendDate: true, 
     _removedHeader: {}, 
     _contentLength: null, 
     _hasBody: true, 
     _trailer: '', 
     finished: false, 
     _headerSent: false, 
     socket: 
     Socket { 
     connecting: false, 
     _hadError: false, 
     _handle: 
      TCP { 
      bytesRead: 611, 
      _externalStream: {}, 
      fd: 14, 
      reading: true, 
      owner: [Circular], 
      onread: [Function: onread], 
      onconnection: null, 
      writeQueueSize: 0, 
      _consumed: true }, 
     _parent: null, 
     _host: null, 
     _readableState: 
      ReadableState { 
      objectMode: false, 
      highWaterMark: 16384, 
      buffer: [Object], 
      length: 0, 
      pipes: null, 
      pipesCount: 0, 
      flowing: true, 
      ended: false, 
      endEmitted: false, 
      reading: true, 
      sync: false, 
      needReadable: true, 
      emittedReadable: false, 
      readableListening: false, 
      resumeScheduled: false, 
      defaultEncoding: 'utf8', 
      ranOut: false, 
      awaitDrain: 0, 
      readingMore: false, 
      decoder: null, 
      encoding: null }, 
     readable: true, 
     domain: null, 
     _events: 
      { end: [Object], 
      finish: [Function: onSocketFinish], 
      _socketEnd: [Function: onSocketEnd], 
      drain: [Object], 
      timeout: [Function], 
      error: [Function: socketOnError], 
      close: [Object], 
      data: [Function: socketOnData], 
      resume: [Function: onSocketResume], 
      pause: [Function: onSocketPause] }, 
     _eventsCount: 10, 
     _maxListeners: undefined, 
     _writableState: 
      WritableState { 
      objectMode: false, 
      highWaterMark: 16384, 
      needDrain: false, 
      ending: false, 
      ended: false, 
      finished: false, 
      decodeStrings: false, 
      defaultEncoding: 'utf8', 
      length: 0, 
      writing: false, 
      corked: 0, 
      sync: true, 
      bufferProcessing: false, 
      onwrite: [Function], 
      writecb: null, 
      writelen: 0, 
      bufferedRequest: null, 
      lastBufferedRequest: null, 
      pendingcb: 0, 
      prefinished: false, 
      errorEmitted: false, 
      bufferedRequestCount: 0, 
      corkedRequestsFree: [Object] }, 
     writable: true, 
     allowHalfOpen: true, 
     destroyed: false, 
     _bytesDispatched: 0, 
     _sockname: null, 
     _pendingData: null, 
     _pendingEncoding: '', 
     server: 
      Server { 
      domain: null, 
      _events: [Object], 
      _eventsCount: 2, 
      _maxListeners: undefined, 
      _connections: 1, 
      _handle: [Object], 
      _usingSlaves: false, 
      _slaves: [], 
      _unref: false, 
      allowHalfOpen: true, 
      pauseOnConnect: false, 
      httpAllowHalfOpen: false, 
      timeout: 120000, 
      _pendingResponseData: 0, 
      _connectionKey: '6::::5050' }, 
     _server: 
      Server { 
      domain: null, 
      _events: [Object], 
      _eventsCount: 2, 
      _maxListeners: undefined, 
      _connections: 1, 
      _handle: [Object], 
      _usingSlaves: false, 
      _slaves: [], 
      _unref: false, 
      allowHalfOpen: true, 
      pauseOnConnect: false, 
      httpAllowHalfOpen: false, 
      timeout: 120000, 
      _pendingResponseData: 0, 
      _connectionKey: '6::::5050' }, 
     _idleTimeout: 120000, 
     _idleNext: 
      TimersList { 
      _idleNext: [Circular], 
      _idlePrev: [Circular], 
      _timer: [Object], 
      _unrefed: true, 
      msecs: 120000, 
      nextTick: false }, 
     _idlePrev: 
      TimersList { 
      _idleNext: [Circular], 
      _idlePrev: [Circular], 
      _timer: [Object], 
      _unrefed: true, 
      msecs: 120000, 
      nextTick: false }, 
     _idleStart: 14449, 
     parser: 
      HTTPParser { 
      '0': [Function: parserOnHeaders], 
      '1': [Function: parserOnHeadersComplete], 
      '2': [Function: parserOnBody], 
      '3': [Function: parserOnMessageComplete], 
      '4': [Function: onParserExecute], 
      _headers: [], 
      _url: '', 
      _consumed: true, 
      socket: [Circular], 
      incoming: [Object], 
      outgoing: null, 
      maxHeaderPairs: 2000, 
      onIncoming: [Function: parserOnIncoming] }, 
     on: [Function: socketOnWrap], 
     _paused: false, 
     read: [Function], 
     _consuming: true, 
     _httpMessage: [Circular] }, 
     connection: 
     Socket { 
     connecting: false, 
     _hadError: false, 
     _handle: 
      TCP { 
      bytesRead: 611, 
      _externalStream: {}, 
      fd: 14, 
      reading: true, 
      owner: [Circular], 
      onread: [Function: onread], 
      onconnection: null, 
      writeQueueSize: 0, 
      _consumed: true }, 
     _parent: null, 
     _host: null, 
     _readableState: 
      ReadableState { 
      objectMode: false, 
      highWaterMark: 16384, 
      buffer: [Object], 
      length: 0, 
      pipes: null, 
      pipesCount: 0, 
      flowing: true, 
      ended: false, 
      endEmitted: false, 
      reading: true, 
      sync: false, 
      needReadable: true, 
      emittedReadable: false, 
      readableListening: false, 
      resumeScheduled: false, 
      defaultEncoding: 'utf8', 
      ranOut: false, 
      awaitDrain: 0, 
      readingMore: false, 
      decoder: null, 
      encoding: null }, 
     readable: true, 
     domain: null, 
     _events: 
      { end: [Object], 
      finish: [Function: onSocketFinish], 
      _socketEnd: [Function: onSocketEnd], 
      drain: [Object], 
      timeout: [Function], 
      error: [Function: socketOnError], 
      close: [Object], 
      data: [Function: socketOnData], 
      resume: [Function: onSocketResume], 
      pause: [Function: onSocketPause] }, 
     _eventsCount: 10, 
     _maxListeners: undefined, 
     _writableState: 
      WritableState { 
      objectMode: false, 
      highWaterMark: 16384, 
      needDrain: false, 
      ending: false, 
      ended: false, 
      finished: false, 
      decodeStrings: false, 
      defaultEncoding: 'utf8', 
      length: 0, 
      writing: false, 
      corked: 0, 
      sync: true, 
      bufferProcessing: false, 
      onwrite: [Function], 
      writecb: null, 
      writelen: 0, 
      bufferedRequest: null, 
      lastBufferedRequest: null, 
      pendingcb: 0, 
      prefinished: false, 
      errorEmitted: false, 
      bufferedRequestCount: 0, 
      corkedRequestsFree: [Object] }, 
     writable: true, 
     allowHalfOpen: true, 
     destroyed: false, 
     _bytesDispatched: 0, 
     _sockname: null, 
     _pendingData: null, 
     _pendingEncoding: '', 
     server: 
      Server { 
      domain: null, 
      _events: [Object], 
      _eventsCount: 2, 
      _maxListeners: undefined, 
      _connections: 1, 
      _handle: [Object], 
      _usingSlaves: false, 
      _slaves: [], 
      _unref: false, 
      allowHalfOpen: true, 
      pauseOnConnect: false, 
      httpAllowHalfOpen: false, 
      timeout: 120000, 
      _pendingResponseData: 0, 
      _connectionKey: '6::::5050' }, 
     _server: 
      Server { 
      domain: null, 
      _events: [Object], 
      _eventsCount: 2, 
      _maxListeners: undefined, 
      _connections: 1, 
      _handle: [Object], 
      _usingSlaves: false, 
      _slaves: [], 
      _unref: false, 
      allowHalfOpen: true, 
      pauseOnConnect: false, 
      httpAllowHalfOpen: false, 
      timeout: 120000, 
      _pendingResponseData: 0, 
      _connectionKey: '6::::5050' }, 
     _idleTimeout: 120000, 
     _idleNext: 
      TimersList { 
      _idleNext: [Circular], 
      _idlePrev: [Circular], 
      _timer: [Object], 
      _unrefed: true, 
      msecs: 120000, 
      nextTick: false }, 
     _idlePrev: 
      TimersList { 
      _idleNext: [Circular], 
      _idlePrev: [Circular], 
      _timer: [Object], 
      _unrefed: true, 
      msecs: 120000, 
      nextTick: false }, 
     _idleStart: 14449, 
     parser: 
      HTTPParser { 
      '0': [Function: parserOnHeaders], 
      '1': [Function: parserOnHeadersComplete], 
      '2': [Function: parserOnBody], 
      '3': [Function: parserOnMessageComplete], 
      '4': [...... 

回答

0

您可以使用此自定義字符串化功能,它可以處理循環依賴。這是標準的,我從別人那裏偷走了它。

const customStringify = function (v) { 
    let cache = []; 
    return JSON.stringify(v, function (key, value) { 
    if (typeof value === 'object' && value !== null) { 
     if (cache.indexOf(value) !== -1) { 
     // Circular reference found, discard key 
     return; 
     } 
     // Store value in our collection 
     cache.push(value); 
    } 
    return value; 
    }); 
}; 

儘管如果您嘗試解析響應,您可能希望調用JSON.parse而不是JSON.stringify。

+0

嘿,我成功轉換的響應成JSON響應。使用該函數,我試圖將其粘貼到JSON格式器工具,我得到多個json根元素錯誤。無論如何,我可以修改代碼以獲得正確的JSON格式。 – Anirudh

+0

發送upvote,我可以給你一個答案哈哈哥們 – Olegzandr

+0

JSON.stringify或這個customStringify函數應該生成適當的JSON ..小心地將它註銷到某處,以便當你複製/粘貼它時,沒有東西會被損壞。我不得不看JSON給你更多的信息。 – Olegzandr

1

最後經過很多次迭代的下面的代碼解決了我的問題:

app.post('url', function(req, res) { 

const customStringify = function (res) { 
let cache = []; 
return JSON.stringify(res, function (key, value) { 
if (typeof value === 'object' && value !== null) { 
    if (cache.indexOf(value) !== -1) { 
    // Circular reference found, discard key 
    return; 
    } 
    // Store value in our collection 

    cache.push(value); 

    } 
    return value; 
}); 
}; 

var jsonObj = customStringify(res); 
var mainObj = JSON.parse(jsonObj); 
var leadObj = mainObj.socket.parser.incoming.body.entry[0].changes[0].value; 
console.log(leadObj); 


});