几天来,我一直在试图弄清楚如何在Javascript中正确接收OData响应。问题是响应被格式化为数组而不是 JSON,因此函数JSON.parse(mydata)
不适用于我接收的数据。
我的问题是双重的:请求 OData 以 JSON 形式发送响应的正确方法是什么和/或如何将当前响应格式化为 JSON?
这是我正在使用的代码:
$.ajax({
type: "GET",
url: requestUri,
dataType: "script",
accept: "application/json",
success: function(data, request) {
var jsonData = JSON.parse(data);
},
error: function(msg) {
alert(msg);
}})
以下是使用console.log
记录变量data
的示例响应:
{"@odata.context":"http://localhost:5001/odata/$metadata#Movies","value":[{"Title":"Pulp Fiction","Genre":"Action","RunTime":0,"Sales":0,"Key":2}]}
问题是响应被格式化为数组而不是 JSON
不可能。您不能通过HTTP发送"数组"。您必须以某种方式对其进行编码...例如,作为 JSON。
除非您使用dataType
选项覆盖它,否则 jQuery 将使用Content-Type
HTTP 响应标头来确定数据的编码方式。如果是 JSON,它将解析 JSON。
data
的值是读取原始responseText
并通过JSON.parse
传递时将获得的值。
所以不要尝试手动解析它。 jQuery已经为你做到了。
跳过该步骤:
var jsonData = JSON.parse(data);
......只需与data
合作.
注意:JSON.parse
的输出是对象、数组或其他 JavaScript 数据类型。JSON 数据是您从JSON.stringify
获得的数据。
如果响应采用 OData 格式(如示例所示),但您希望它采用可由JSON.parse分析的 JSON 格式,请将$format=json添加到 OData 查询,只要 OData 终结点支持它。我知道 Dynamics 365 没有。
您可以将其添加到变量中并像这样访问它。
var v={"@odata.context":"http://localhost:5001/odata/$metadata#Movies","value":[{"Title":"Pulp Fiction","Genre":"Action","RunTime":0,"Sales":0,"Key":2}]};
//v.value[0] is a json object
console.log(v.value[0]);
或者完全跳过作业并通过以下方式访问:
data.value[0]
data.value[0].Genre
data.value[0].RunTime
etc....