OData 返回数组而不是 JSON - 如何转换?



几天来,我一直在试图弄清楚如何在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-TypeHTTP 响应标头来确定数据的编码方式。如果是 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....

最新更新