122 votos

Ajax de Jquery Publicación json webservice

Hola a todos yo soy tryng para publicar un objeto JSON a un asp.net webservice.

Mi json se parece a esto:

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

Yo estoy usando el json2.js a stringyfy mi objeto json.

y estoy usando jquery para publicarlo en mi webservice.

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

Recibo el siguiente error:

"No válido JSON primitiva:

He encontrado un montón de mensajes relacionados con este y que parece ser realmente un problema común, pero nada de lo que yo intente corrige el problema.

Cuando firebug lo que está siendo publicado en el servidor se parece a esto:

marcadores%5B0%5D%5Bposition%5D=128.3657142857143 y marcadores%5B0%5D%5BmarkerPosition%5D=7&marcadores%5B1%5D%5Bposition%5D=235.1944023323615 y marcadores%5B1%5D%5BmarkerPosition%5D=19&marcadores%5B2%5D%5Bposition%5D=42.5978231292517 y marcadores%5B2%5D%5BmarkerPosition%5D=-3

Mi webservice función que se llama:

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

Cualquier ayuda que usted puede dar sería muy apreciada, sé que hay un montón de posts sobre esto, pero realmente nada de lo que han encontrado útil.

217voto

Dave Ward Puntos 36006

Usted ha mencionado el uso de json2.js a stringify sus datos, pero los datos enviados parece ser URLEncoded JSON puede Que ya hayas visto, pero este post acerca de la inválido JSON primitivo cubre por qué el JSON que se URLEncoded.

Me gustaría aconsejar en contra de aprobar una materia, manualmente serializado en JSON cadena en su método. ASP.NET va a JSON automática deserializar la solicitud POSTERIOR de los datos, así que si estás manualmente la serialización y el envío de una cadena JSON a ASP.NET, que en realidad va a tener que acabar JSON serializar su JSON cadena serializada.

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 la inválido JSON primitivo problema es pasar de jQuery JSON cadena para el data parámetro, no un objeto de JavaScript, por lo que jQuery no intento URLEncode sus datos.

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

public class Marker
{
  decimal position { get; set; }
  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 deserializer que ASMX ScriptServices usos (JavaScriptSerializer) es bastante flexible, y hará todo lo posible para convertir los datos de entrada en el lado del servidor tipo que especifique.

9voto

Felix Kling Puntos 247451
  1. markers no es un objeto JSON. Es normal que los objetos de JavaScript.
  2. Lea acerca de la data: opción:

    Los datos se envían al servidor. Se convierte en una cadena de consulta, si no ya una cadena.

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

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

jQuery no convertir objetos o arrays JSON de forma automática.


Pero supongo que el mensaje de error proviene de la interpretación de la respuesta del servicio. El texto se envía de regreso no está JSON. Las cadenas JSON tiene que estar entre comillas dobles. De manera que tendría que hacer:

return "\"received markers\"";

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

2voto

Me he encontrado con esta demasiado y esta es mi solución.

Si usted está encontrando un inválido objeto json excepción al analizar los datos, a pesar de que sabe que su cadena json es correcta, stringify los datos que usted ha recibido en su código ajax antes de analizar 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 ...

1voto

Usha Puntos 154

Traté de Dave Ward solución. La parte de los datos no se envían desde el navegador en la carga de la parte de la solicitud post como el contentType se establece en "application/json". Una vez que me quita esta línea de 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);
    }
});

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X