当我发现这个奇怪的javascript问题时,我正在阅读代码片段并弄清楚它是如何工作的。
在他们的javascript中,他们打电话给
var apiUrl = '/api/v1/pin/?format=json&order_by=-id&offset='+String(offset);
...
$.get(apiUrl, function(pins) {
for (...; i < pins.objects.length; i++) ... // works fine
});
他们的api返回这个json格式:
{"meta": {"limit": 50, "next": "?limit=50&format=json&order_by=-id&offset=60", "offset":
10, "previous": null, "total_count": 79}, "objects": [ {...},{...}, ... ]}
我试图模仿它,但$ .get从未接受我的简化json字符串。
// my attempt
$.get(myApiUrl, function(pins) {
for (...; i < pins.objects.length; i++) ... // ERROR: undefined length
});
我的Json字符串采用相似但缩短的格式。
{"objects": [{...},{...}, ... ]}
直到我用Google搜索$ .getJson()命令才能让它工作。我只是想知道为什么他们的javascript代码只使用$ .get而我的必须使用$ .getJson ??
你可以设置某种标题来强制javascript将其读作json吗?
答案 0 :(得分:3)
如果您没有明确指定内容类型,jQuery将尝试根据服务器返回的标头确定数据类型。
如果您没有使用JSON序列化程序,请使用http://jsonlint.com/或this验证JSON的有效性,否则您将收到错误。
JSON的正确ContentType标头是:application/json
答案 1 :(得分:3)
在这两种情况下,AJAX调用都返回一个字符串。 jQuery
以某种方式必须弄清楚如何处理它。它是如何做的取决于dataType
选项。
文档调用默认值Intelligent guess
。怎么猜?评估响应的Content-Type
标头。如果是application/json
,则jQuery
将尝试创建对象。
为确保jQuery
始终尝试将回复解释为JSON
,您可以将dataType
设置为json
。
答案 2 :(得分:2)
将HTTP响应标头Content-Type
设置为application/json
例如:
HTTP/1.1 200 OK
Content-Type: application/json