Я пытаюсь отправить объект 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:
Я нашел кучу сообщений, связанных с этим, и кажется, что это действительно распространенная проблема, но ничего из того, что я пробовал, не устраняет проблему.
Когда 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
Моя вызываемая функция веб-сервиса имеет следующий вид:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Вы упомянули об использовании json2.js для структуризации данных, но опубликованные данные выглядят как URLEncoded JSON Возможно, вы уже видели это, но в этом сообщении о недействительном примитиве JSON описано, почему JSON является URLEncoded.
Я бы не советовал передавать необработанную, вручную сериализованную строку JSON в ваш метод. ASP.NET автоматически десериализует JSON данные POST запроса, поэтому если вы вручную сериализуете и отправляете JSON строку в ASP.NET, то в итоге вам придется сериализовать вашу 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\"";
Я не уверен, что ваша проблема заключается в отправке или получении данных.
Я попробовал Дэйв Уорд'ы решение. Данные не отправляются из браузера в нагрузку часть запроса POST как значение contentType установлен в "Приложение/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);
}
});
Я тоже с этим столкнулся, и вот мое решение.
Если вы столкнулись с исключением invalid json object при разборе данных, даже если вы знаете, что ваша строка 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 ...
У меня есть запрос,
$("#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 и получить строку в `"успеха", но я'м не получая ответа.
Пожалуйста, это для вызова AJAX для веб-сервиса на 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);
}
});