Я намагаюсь розмістити JSON об'єкт на веб-сервісі asp.net.
Мій json виглядає наступним чином:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Я використовую json2.js для перетворення мого json-об'єкта в рядок.
і я використовую jquery, щоб розмістити його на моєму веб-сервісі.
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
data: markers,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
Я отримую наступну помилку:
"Недійсний примітив JSON:
Я знайшов купу повідомлень, пов'язаних з цим, і це, здається, дійсно поширена проблема, але нічого з того, що я намагаюся виправити, не вирішує проблему.
Коли ви перевіряєте те, що відправляється на сервер, це виглядає наступним чином:
markers%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3
Викликається функція мого веб-сервісу:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Ви згадали про використання json2.js для структурування ваших даних, але відправлені дані виглядають як URLE-кодований JSON Можливо, ви вже бачили це, але ця публікація про недійсний примітив JSON охоплює питання, чому JSON кодується URLE-кодом.
Я б не рекомендував передавати необроблений, серіалізований вручну рядок JSON у ваш метод. ASP.NET збирається автоматично JSON десеріалізувати POST-дані запиту, тому якщо ви вручну серіалізуєте та надсилаєте рядок JSON до ASP.NET, вам фактично доведеться серіалізувати ваш рядок JSON серіалізованим JSON.
Я б запропонував щось більше в цьому напрямку:
var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }];
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
// The key needs to match your method's input parameter (case-sensitive).
data: JSON.stringify({ Markers: markers }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
Ключ до уникнення проблеми з недійсним примітивом JSON полягає в тому, щоб передати jQuery рядок JSON для параметра data
, а не об'єкт JavaScript, щоб jQuery не намагався URLEncode ваші дані.
На стороні сервера узгодьте вхідні параметри вашого методу з формою даних, які ви передаєте:
public class Marker
{
public decimal position { get; set; }
public int markerPosition { get; set; }
}
[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
return "Received " + Markers.Count + " markers.";
}
Ви також можете прийняти масив, наприклад Marker[] Markers
, якщо бажаєте. Десеріалізатор, який використовує ASMX ScriptServices (JavaScriptSerializer), є досить гнучким і зробить все можливе, щоб перетворити ваші вхідні дані у вказаний вами тип на стороні сервера.
markers
не є JSON об'єктом. Це звичайний JavaScript об'єкт.data:
:Дані для відправки на сервер. Перетворюються в рядок запиту, якщо ще не є рядком.
Якщо ви хочете відправити дані у вигляді JSON, їх потрібно попередньо закодувати:
data: {markers: JSON.stringify(markers)}
jQuery не перетворює об'єкти або масиви в JSON автоматично.
Але я припускаю, що повідомлення про помилку походить від інтерпретації відповіді сервісу. Текст, який ви відправляєте назад, не є JSON. Рядки JSON потрібно брати в подвійні лапки. Так що вам доведеться зробити:
return "\"received markers\"";
Я не впевнений, що ваша проблема полягає у надсиланні або отриманні даних.
Я теж зіткнувся з цією проблемою, і це моє рішення.
Якщо ви зіткнулися з виключенням недійсного json-об'єкта при розборі даних, навіть якщо ви знаєте, що ваш json-рядок коректний, то перед розбором даних в JSON вирівняйте дані, які ви отримали в своєму ajax-коді, в рядки:
$.post(CONTEXT+"servlet/capture",{
yesTransactionId : yesTransactionId,
productOfferId : productOfferId
},
function(data){
try{
var trimData = $.trim(JSON.stringify(data));
var obj = $.parseJSON(trimData);
if(obj.success == 'true'){
//some codes ...