簡體   English   中英

JSON或JSONP查詢以檢索數據

[英]JSON or JSONP query to retrieve data

關於此類問題,SO上有很多問題,例如:

在JSONP中使用.ajax()的基本示例?

但是我似乎無法讓他們中的任何一個返回明智的結果。

我已經獲得了一個API調用過程來使用(我相信它基於REST API)從服務器檢索值,它看起來像這樣:

http://stage.xxxxxxxxx.co.uk/Search/?q=london&srid=3857&format=json&api_key=xxxxxxxxxxxxxxxxxxxxxxxx

出於明顯的原因,我不得不使用xxxxx,尤其是對於密鑰。

將此內容提交到諸如IE之類的Web瀏覽器將返回看起來像是JSON對象的內容,如下所示:

{
    "features": [
        {
            "id": 2728329,
            "name": "LONDON",
            "city": null,
            "county": "LONDON",
            "address": "LONDON",
            "address_2": null,
            "display_text": "LONDON LONDON",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    -16004.689675,
                    6708355.967961
                ]
            },
            "lon": -16004.689675330877,
            "lat": 6708355.967960811
        }
    ]
}

我遇到的麻煩是嘗試使用jQuery將這個對象檢索為JSON對象(甚至是字符串)。

我很快發現XMLHttpRequest因為使用了“相同的域”而無法使用,所以我轉向JSONP,但是我無法理解如何正確使用它。

例如,我有這個:

$.getJSON("http://stage.xxxxxxxxxxx.co.uk/Search/?q=london&srid=3857&format=json&api_key=xxxxxxxxxxxxxxxxxxxxxxxxx?callback=?", function(result) {
    format: "json"
}); 

我從哪里可以得到上面提到的JSON對象?

我很快發現XMLHttpRequest因為使用了“相同的域”而無法使用,所以我轉向JSONP,但是我無法理解如何正確使用它。

除非您正在調用的端點支持JSONP,並且您告訴它這就是您所要求的,否則您不能使用JSONP。 這是因為它必須發送回不同的格式(JSONP而不是JSON)。

盡管看起來幾乎相同,但JSON和JSONP根本不同。 JSON響應是一種文本格式,根據JSON標准定義數據(在http://json.org上有詳細記錄,更正式的地方是RFC)。 JSONP響應是傳入JavaScript對象的函數調用 ,該JavaScript對象應作為腳本代碼執行。

這是一個簡單的理論性JSON查詢和響應的示例:

要求: http://example.com/give-me-deh-stuff?format=json&id=foo : http://example.com/give-me-deh-stuff?format=json&id=foo

響應:

{"stuff": {"foo":"bar"}}

這是等效的簡單理論JSONP查詢和響應的示例,其中您未指定回調名稱:

要求: http://example.com/give-me-deh-stuff?format=jsonp&id=foo : http://example.com/give-me-deh-stuff?format=jsonp&id=foo

響應:

callback({"stuff": {"foo":"bar"}})

..以及您在其中執行的操作:

請求: http://example.com/give-me-deh-stuff?format=jsonp&callback=_cb12345&id=foo : http://example.com/give-me-deh-stuff?format=jsonp&callback=_cb12345&id=foo

響應:

_cb12345({"stuff": {"foo":"bar"}})

如果端點支持JSONP,則jQuery將愉快地提供回調函數並在URL上設置參數,您只需要告訴它調用了什么參數即可(如果沒有,則假定為callback ,許多API使用並且許多其他API都使用) ')。

請注意,現在JSONP版本正在調用一個函數( callback_cb12345 )。 您的代碼(或jQuery)確保在全局范圍內有一個具有該名稱的函數,然后在腳本中附加請求URL,並在返回時運行。 JSONP就是這樣避免了相同來源策略。

可以通過JSON.NET通過JsonSchema對象完成

下面是一個從JSON檢索數據的簡單示例

string schemaJson = @"{
  'description': 'A person',
  'type': 'object',
  'properties': {
  'name': {'type':'string'},
  'hobbies': {
  'type': 'array',
 'items': {'type':'string'}
  }
 }
}";

JsonSchema schema = JsonSchema.Parse(schemaJson);

Console.WriteLine(schema.Type);
// Object

foreach (var property in schema.Properties)
{
Console.WriteLine(property.Key + " - " + property.Value.Type);
}
// name - String
// hobbies - Array

這只是一種簡單的獲取數據的方法...有很多方法可以獲取數據以獲取更多詳細信息,請單擊此處以獲取JSON.NET的文檔以處理JSON數據。

我希望我的回答是有幫助的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM