2011-06-12 21 views
183

Estoy tratando de publicar un objeto JSON en un servicio web asp.net.Jquery Ajax Publicar json en el servicio web

Mi JSON se ve así:

var markers = { "markers": [ 
    { "position": "128.3657142857143", "markerPosition": "7" }, 
    { "position": "235.1944023323615", "markerPosition": "19" }, 
    { "position": "42.5978231292517", "markerPosition": "-3" } 
]}; 

estoy usando el json2.js a stringyfy mi objeto JSON.

y estoy usando jquery para publicarlo en mi servicio web.

$.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); 
     } 
    }); 

estoy consiguiendo el error siguiente:

"no válida JSON primitiva:

he encontrado un montón de puestos relacionados con esto y que parece ser un problema muy común, pero nada que intento soluciona el problema

Cuando firebug lo que se ha publicado en el servidor que tiene este aspecto:.

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

Mi función de servicio web que está siendo llamado es:

[WebMethod] 
public string CreateMarkers(string markerArray) 
{ 
    return "received markers"; 
} 
+0

'error' no se proporciona como una configuración posible entre las que figuran en http://api.jquery.com/jQuery.ajax/ ... ¿tal vez lo confundió con 'error' en su lugar? – danicotra

Respuesta

314

Usted mencionó usar json2.js para codificar sus datos, pero los datos POSTed parecen estar URLEncoded JSON Puede que ya lo haya visto, pero this post about the invalid JSON primitive explica por qué el JSON está siendo URLEncoded.

I'd advise against passing a raw, manually-serialized JSON string into your method. ASP.NET va a deserializar automáticamente los datos POST de la solicitud, de modo que si está serializando manualmente y enviando una cadena JSON a ASP.NET, terminará teniendo que serializar JSON su cadena serializada JSON.

me gustaría sugerir algo más a lo largo de estas líneas:

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); 
    } 
}); 

La clave para evitar el problema primitivo inválida JSON es pasar una cadena JSON jQuery para el parámetro data, no un objeto de JavaScript, por lo que jQuery no intenta URLEncode sus datos.

En el lado del servidor, coinciden con los parámetros de entrada de su método a la forma de los datos que está pasando en:

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."; 
} 

También puede aceptar una matriz, como Marker[] Markers, si lo prefiere. El deserializador que utiliza ASMX ScriptServices (JavaScriptSerializer) es bastante flexible y hará todo lo posible para convertir los datos de entrada en el tipo de servidor que especifique.

+0

¡Eso es! ¡Muchas gracias por su respuesta detallada! –

+3

Usted escribió "para que jQuery no intente URLEncode sus datos.", pero no es correcto. Para detener jquery de urlencoding sus datos debe establecer processData en falso. – Softlion

+8

Pasar una cadena es suficiente para evitar que jQuery de URLEncodifique el parámetro de datos. Puede establecer proces sData es falso, pero es superfluo (y hacerlo solo, sin pasar una cadena JSON para los datos, no es suficiente). –

11
  1. markers no es un objeto JSON. Es un objeto JavaScript normal.
  2. Read about the data: option:

    Data to be sent to the server. It is converted to a query string, if not already a string.

Si desea enviar los datos como JSON, usted tiene que codificar primero:

data: {markers: JSON.stringify(markers)} 

jQuery no convierte objetos o matrices para JSON automáticamente.


Pero supongo que el mensaje de error proviene de la interpretación de la respuesta del servicio. El texto que envía de vuelta no es JSON. Las cadenas JSON tienen que estar entre comillas dobles. Entonces tendría que hacer:

return "\"received markers\""; 

No estoy seguro de si su problema actual es el envío o la recepción de los datos.

+0

Gracias por ayudar a Felix, pensé que al ejecutar marcadores a través del método JSON.stringyfy lo estaba convirtiendo en una cadena de consulta, he hecho lo que sugeriste pero desafortunadamente no funciona. No estoy publicando lo siguiente. –

+0

marcadores =% 7B% 22 marcadores% 22% 3A% 5B% 7B% 22posición% 22% 3A% 22128.3657142857143% 22% 2C% 22markerPosición% 22% 3A% 227% 22% 7D% 2C% 7B% 22posición% 22% 3A% 22235.1944023323615% 22% 2C% 22markerPosition% 22% 3A% 2219% 22% 7D% 2C% 7B% 22position% 22% 3A% 2242.5978231292517% 22% 2C% 22markerPosition% 22% 3A% 22-3% 22% 7D% 5D% 7D –

+0

@Dreamguts: No tengo claro qué es lo que quieres. ¿Desea enviar 'marcadores' como cadena JSON? –

2

He encontrado este también y esta es mi solución.

Si se encuentra una excepción objeto JSON no válida al analizar los datos, a pesar de saber que su cadena JSON es correcta, stringify los datos que ha recibido en su código Ajax antes de analizarlo a 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 ... 
2

Intenté la solución de Dave Ward. La parte de datos no se enviaba desde el navegador en la parte de la carga útil de la solicitud posterior ya que el contentType está configurado en "application/json". Una vez que eliminé esta línea, todo funcionó de maravilla.

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

Por favor, siga esto por llamada AJAX al servicio web de java

$.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); 
      } 
     }); 
+0

aquí cómo listar el objeto pasar a json a la llamada ajax del servicio web java. –

0

tengo consulta,

$("#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); 
      } 
     }); 

    }); 

les dejo los datos de acceso en las JSON y conseguir una cadena como "Success", pero no recibo la respuesta.

+1

Esta no es la respuesta a la pregunta. Si desea hacer la pregunta, vaya al menú "Pregunta" y haga clic en "Hacer pregunta", y si su pregunta está relacionada con esta pregunta, proporcione el enlace de referencia en su pregunta. – Mittal

+1

Si tiene una nueva pregunta, por favor, haga clic en el botón [Ask Question] (https://stackoverflow.com/questions/ask). Incluye un enlace a esta pregunta si ayuda a proporcionar contexto. - [De la crítica] (/ review/low-quality-posts/18595928) – VKen

Cuestiones relacionadas