JQuery Ajax публикация json в веб-сервис
Я пытаюсь опубликовать объект JSON в asp.net веб-сервис.
мой json выглядит так:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Я использую json2.js для stringyfy мой объект 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:
Я нашел кучу сообщений, связанных с этим, и это, кажется, действительно распространенная проблема, но ничего, что я пытаюсь исправить вопрос.
когда firebug, что публикуется на сервере, выглядит так:
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
моя вызываемая функция webservice:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
6 ответов
вы упомянули использование json2.js для stringify ваших данных, но опубликованные данные, похоже, URLEncoded JSON вы, возможно, уже видели его, но этот пост о недопустимом примитиве JSON охватывает, почему JSON URLEncoded.
Я советую против передача необработанной, вручную сериализованной строки JSON в ваш метод. ASP.NET собирается автоматически десериализовать данные POST запроса JSON, поэтому, если вы вручную сериализуете и отправка строки 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 верна, stringify данные, полученные в коде ajax, прежде чем анализировать его в JSON:
$.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 ...
я попробовал решение Дэйва Уорда. Часть данных не была отправлена из браузера в полезной нагрузке части запроса post как contentType установлено значение "application/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);
}
});
у меня есть запрос,
$("#login-button").click(function(e){ alert("hiii");
var username = $("#username-field").val();
var password = $("#username-field").val();
alert(username);
alert("password" + password);
var markers = { "userName" : "admin","password" : "admin123"};
$.ajax({
type: "POST",
url: url,
// The key needs to match your method's input parameter (case-sensitive).
data: JSON.stringify(markers),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert("got the data"+data);},
failure: function(errMsg) {
alert(errMsg);
}
});
});
я публикую данные для входа в json и получаю строку как "Success"
,но я не получаю ответа.
пожалуйста, следуйте этому вызову ajax в webservice java ВАР парам = { feildName: feildValue }; формат JSON.преобразовать в строки({данные : параметр})
$.ajax({
dataType : 'json',
type : 'POST',
contentType : 'application/json',
url : '<%=request.getContextPath()%>/rest/priceGroups',
data : JSON.stringify({data : param}),
success : function(res) {
if(res.success == true){
$('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in');
$('#alertMessage').removeClass('alert-danger alert-info');
initPriceGroupsList();
priceGroupId = 0;
resetForm();
}else{
$('#alertMessage').html(res.message).addClass('alert alert-danger fade in');
}
$('#alertMessage').alert();
window.setTimeout(function() {
$('#alertMessage').removeClass('in');
document.getElementById('message').style.display = 'none';
}, 5000);
}
});