Я пытался понять, как правильно получить ответ OData в Javascript в течение нескольких дней. Проблема в том, что ответ отформатирован как массив вместо 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);
}})
Ниже приведен пример ответа на запись data
переменной с помощью console.log
:
{"@odata.context":"http://localhost:5001/odata/$metadata#Movies","value":[{"Title":"Pulp Fiction","Genre":"Action","RunTime":0,"Sales":0,"Key":2}]}
Вы можете добавить его к переменной и получить доступ к ней именно так.
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....
Проблема в том, что ответ отформатирован как массив вместо JSON
Этого не может быть. Вы не можете отправить "массив" через HTTP. Вы должны каким-то образом закодировать его... например, как JSON.
jQuery будет, если вы не переопределите его с dataType
параметра dataType
, используйте заголовок ответа HTTP Content-Type
HTTP, чтобы определить, как кодируются данные. Если это JSON, он будет разбирать JSON.
Значение data
является то, что вы получите, если вы читаете сырые responseText
и передал его через JSON.parse
.
Поэтому просто не пытайтесь разобрать его вручную. jQuery сделал это для вас.
Пропустите шаг:
var jsonData = JSON.parse(data);
... и просто работать с data
.
NB: вывод JSON.parse
- это объект, массив или другой тип данных JavaScript. Данные JSON - это то, что вы получаете от JSON.stringify
.
data.data
Если ответ находится в формате OData, как показывает ваш пример, но вы хотите, чтобы он был в формате JSON, который можно проанализировать с помощью JSON.parse, добавьте $ format = json в запрос OData, если конечная точка OData поддерживает его. Я знаю, что Dynamics 365 нет.