Я пытаюсь опубликовать объект 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 отправляется на сервер, он выглядит так:
Маркеры% 5B0% 5D% 5Bposition% 5D = 128,3657142857143 & маркеры% 5B0% 5D% 5BmarkerPosition% 5D = 7 & маркеры% 5B1% 5D% 5Bposition% 5D = 235,1944023323615 & маркеры% 5B1% 5D% 5BmarkerPosition% 5D = 19 & маркеры% 5В2% 5D% 5Bposition% 5D = +42,5978231292517 & маркеры% 5В2% 5D% 5BmarkerPosition% 5D = -3
Моя функция webservice, вызываемая:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Вы упомянули использование json2.js, чтобы укрепить ваши данные, но данные POSTed выглядят как URLEncoded JSON. Возможно, вы уже видели это, но этот пост о некорректном примитиве JSON охватывает, почему JSON является URLEncoded.
Я бы советовал не передавать в ваш метод неровную, ручную сериализованную строку 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 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
, если хотите. Deserializer, который использует ASMX ScriptServices (JavaScriptSerializer), довольно гибкий и сделает все возможное, чтобы преобразовать ваши входные данные в указанный вами тип сервера.
markers
не является объектом JSON. Это обычный объект JavaScript.data:
:
Данные для отправки на сервер. Он преобразуется в строку запроса, если уже не строка.
Если вы хотите отправить данные как JSON, вам необходимо сначала закодировать его:
data: {markers: JSON.stringify(markers)}
jQuery не конвертирует объекты или массивы в JSON автоматически.
Но я предполагаю, что сообщение об ошибке происходит от интерпретации ответа службы. Текст, который вы отправляете, не является JSON. Строки JSON должны быть заключены в двойные кавычки. Поэтому вам нужно будет сделать:
return "\"received markers\"";
Я не уверен, что ваша фактическая проблема отправляет или получает данные.
Я попробовал решение Дейва Уорда. Часть данных не была отправлена из браузера в части полезной нагрузки почтового запроса, поскольку для параметра 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 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-объекта, даже если знаете, что ваша строка json верна, строчите данные, полученные вами в вашем коде 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 ...
Пожалуйста, следуйте этому путем ajax-вызова веб-сервиса java
var param = {
priceGroupId : priceGroupId,
divId : selectedDivId,
priceGroupName : $('#priceGroupName').val(),
priceGroupDescription : $('#desc').val(),
indexNumber : $('#indexNumber').val(),
priceList : priceGroupId == 0 ? '' : priceList
<%-- <% for(int index=0;index<10;index++){%>
priceList[<%=index%>].regularSellPrice : $('#storePrice_<%=index%>').val(),
<%}%>
priceList[10].regularSellPrice : $('#storePrice_10').val() --%>
}
$.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);
}
});
//any idea about when variable of javascript has list object of another list
//Like,
var priceList = [];
for(var index=0;index<priceListLength;index++){
if(initPriceListLength == 0){
priceGroupStoreId = 0;
}
priceList.push({
regularSellPrice : $('#storePrice_'+index).val(),
rebateAmount : $('#rebateAmount_'+index).val(),
storeId : $('#storeId_'+index).val(),
storeName : $('#storeName_'+index).val(),
postponeDate : $('#datePostpone').val(),
});
}