2017-03-17 53 views
1

從此wikipedia API調用返回的JSON響應是一系列嵌套對象。要沿着對象屬性鏈訪問感興趣的文本,我必須首先訪問一個屬性,該屬性的值是一個隨機數,這取決於我通過標題查詢的維基百科頁面。如何訪問其值爲未知整數的JS對象屬性?

標題爲頁面"San%20Francisco"(頁面ID = 49728)的一個例子:

對象屬性鏈

responseJSON.wiki[0].query.pages[<<page id>>].extract 

API呼叫範例:https://en.wikipedia.org/w/api.php/?origin=*&format=json&action=query&prop=extracts&exintro=&explaintext=&titles=San%20Francisco

有沒有一些方法,我可以識別其值爲隨機整數的屬性?鏈中只有一個子頁面的值是一個整數。我想不出另一個解決方案,並且不知道任何有效的JSON解析方法。

我對AJAX請求沒有經驗,並正在使用jQuery以這種方式進行我的ajax調用。我想如果我做一些天真地提到這一點:

var getWiki = function (obj) { 
    return $.ajax({ 
     url: "http://en.wikipedia.org/w/api.php" + 
      "?origin=*" + "&format=json" + 
      "&action=query" + "&prop=extracts" + 
      "&exintro=" + "&explaintext=" + "&titles=" + 
      obj.position, 
     method: 'GET' 
    }); 
}; 
+0

'Object.keys()'可能有幫助。 – Sirko

回答

1

如果您object只有一個鍵,就可以得到它使用Object.keys(object)[0],然後執行原始object動態括號符號屬性訪問。 (這是實用程序在以下示例中執行的操作。)

另請注意,您可以使用.promise()來使您的JSON響應更加整潔。我建議你將type: 'json'也添加到你的AJAX請求中,這樣你就不必自己解析字符串數據。

function getWiki(obj) { 
 
    return $.ajax({ 
 
    url: "http://en.wikipedia.org/w/api.php" + 
 
     "?origin=*" + "&format=json" + 
 
     "&action=query" + "&prop=extracts" + 
 
     "&exintro=" + "&explaintext=" + "&titles=" + 
 
     obj.position, 
 
    method: 'GET', 
 
    type: 'json' 
 
    }).promise() 
 
} 
 

 

 
function dig(object) { 
 
    return object[Object.keys(object)[0]] 
 
} 
 

 

 
getWiki({ 
 
    position: 'San Francisco' 
 
    }) 
 
    .then(function(json) { 
 
    console.log(
 
     dig(json.query.pages).extract //=> 'San Francisco (SF) ...' 
 
    ) 
 
    })
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

1

哦,如果有一個人總頁面的單個屬性對象,那麼你可以嘗試兩種方法:

if (typeof Object.values !== 'function') { 
 
    Object.values = obj => Object.keys(obj).map(key => obj[key]); 
 
} 
 

 
const responseJSON = { 
 
    "batchcomplete": "", 
 
    "query": { 
 
    "pages": { 
 
     "49728": { 
 
     "pageid": 49728, 
 
     "ns": 0, 
 
     "title": "San Francisco", 
 
     "extract": "Some text" 
 
     } 
 
    } 
 
    } 
 
} 
 

 
const pages = responseJSON.query.pages; 
 

 
const extractedWithKeys = pages[Object.keys(pages)[0]]; 
 
const extractedObjValues = Object.values(pages)[0]; 
 

 
console.log(extractedWithKeys, extractedObjValues)

0

實際上,你可以做到這一點沒有Object.keys或其他類似的技巧,如果你添加查詢的參數。

API呼叫範例:https://en.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&indexpageids=1&titles=San+Francisco&exintro=1&explaintext=1

例JSON輸出:

{ 
    "batchcomplete": "", 
    "query": { 
     "pageids": [ 
      "49728" 
     ], 
     "pages": { 
      "49728": { 
       "pageid": 49728, 
       "ns": 0, 
       "title": "San Francisco", 
       "extract": "San Francisco (initials SF) <snip>" 
      } 
     } 
    } 
} 

然後你就可以考慮使用類似data.query.pages[data.query.pageids[0]].extract得到提取物(雖然熊,有時沒有頁面可以返回,這取決於你使用什麼查詢)。

維基百科的API sandbox對發現像indexpageids這樣的參數非常有用 - 實驗通常比閱讀文檔更快。