#jquery #json
#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 what отправляется на сервер, это выглядит так:
markers[0][position]=128.3657142857143amp;markers[0][markerPosition]=7amp;markers[1][position]=235.1944023323615amp;markers[1][markerPosition]=19amp;markers[2][position]=42.5978231292517amp;маркеры[2][markerPosition] =-3
Моя вызываемая функция веб-сервиса:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
Комментарии:
1. «сбой» не указан в качестве возможного параметра среди перечисленных в api.jquery.com/jQuery.ajax … может быть, вы перепутали это с «ошибкой» вместо этого?
Ответ №1:
Вы упомянули использование json2.js чтобы упорядочить ваши данные, но опубликованные данные выглядят как 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);},
error: 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), довольно гибкий и сделает все возможное, чтобы преобразовать ваши входные данные в указанный вами тип на стороне сервера.
Комментарии:
1. Вы написали «чтобы jQuery не пытался URLEncode ваших данных.», но это неверно. Чтобы остановить jquery от urlencoding ваших данных, вы должны установить ProcessData в false.
2. Достаточно передать строку, чтобы jQuery не смог URLEncoding параметр data. Вы можете установить для ProcessData значение false , но это излишне (и делать это самостоятельно, без передачи строки JSON для данных, недостаточно).
3. Эта же проблема (и ответ) относится и к Rails.
4. @DaveWard
contentType
учитывается, используем ли мы GET, а не POST ?5. Используется
file_get_contents('php://input')
для ввода вашихjson
данныхphp
.
Ответ №2:
markers
не является объектом JSON. Это обычный объект JavaScript.- Прочитайте о
data:
опции:
Данные, которые должны быть отправлены на сервер. Он преобразуется в строку запроса, если еще не является строкой.
Если вы хотите отправить данные в формате JSON, вы должны сначала их закодировать:
data: {markers: JSON.stringify(markers)}
jQuery не преобразует объекты или массивы в JSON автоматически.
Но я предполагаю, что сообщение об ошибке приходит из-за интерпретации ответа службы. Текст, который вы отправляете обратно, не является JSON. Строки JSON должны быть заключены в двойные кавычки. Итак, вам нужно будет сделать:
return ""received markers"";
Я не уверен, что ваша реальная проблема заключается в отправке или получении данных.
Комментарии:
1. Спасибо за помощь, Феликс, я подумал, что, запустив маркеры через метод JSON.stringyfy, я преобразовал его в строку запроса, я сделал так, как вы предложили, но, к сожалению, это не работает, я не публикую следующее.
2. markers={«markers»:[{«position»:»128.3657142857143″,»markerPosition»:»7″},{«position»:»235.1944023323615″,»markerPosition»:»19″},{«position»:»42.5978231292517″,»markerPosition»:»-3″}]}
3. @Dreamguts: Мне немного непонятно, чего вы хотите. Вы хотите отправить
markers
в виде строки JSON?4. Привет, Феликс, да, я хочу отправить объект markers в виде строки JSON, чтобы я мог использовать его в своем веб-сервисе.
5. @Dreamguts: тогда это должно работать таким образом. Также «код», который вы опубликовали в комментарии, выглядит нормально. Конечно, вы должны правильно декодировать его на стороне сервера, и, возможно, вам придется изменить имя параметра, я не знаю.
Ответ №3:
Я попробовал решение Дейва Уорда. Часть данных не отправлялась из браузера в части полезной нагрузки запроса 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);
}
});
Комментарии:
1. Я работаю с сервером, к которому у меня нет доступа. Я удалил ContentType, это помогло. Но полезная нагрузка передавалась с ним и без него. Что-то еще изменилось. Тип содержимого изменен на «application / x-www-form-urlencoded», что неверно, но это работает. Магия. Спасибо.
Ответ №4:
Я тоже сталкивался с этим, и это мое решение.
Если при анализе данных вы сталкиваетесь с недопустимым исключением объекта 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 ...
Ответ №5:
Пожалуйста, следуйте этому, чтобы с помощью ajax вызвать веб-сервис java var param = { feildName: feildValue }; JSON.stringify({data : param})
$.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);
}
});
Комментарии:
1. вот как перечислить передачу объекта в json для вызова ajax веб-сервиса Java.