¿No estoy devolviendo esta cadena JSON correctamente?

Estoy tratando de tomar algunos valores de la base de datos usando AJAX, pero cada vez que reviso Firebug, veo la copia html en su lugar.

function foo() { $.ajax({ type: "POST", url: "cssAttempt3.aspx/ConvertDataTabletoString", data: {}, dataType: 'json', success: function (response) { console.log(result); //I have tried a bunch of things here. //console.log(response, response[0], response[0].value, //JSON.parse(''), JSON.parse(response), JSON.stringify(response), and the list goes on. //Every single time, Firebug shoots back the html document. //Nothing really stands out in this html document. No errors. //But time to time, Firebug will say unidentified character //JSON.parse: unexpected character //Line 4 //Which can't be right, I'm using Google's jQuery and the console.log below is parsed correctly. //If you look up there, result and response are two different things //But Firebug won't report any error even when I compile that. //I've even typed alert("ASDFSAOF") just to see what happens. Nothing. //I haven't seen "Fail" either. }, failure: function () { console.log("Fail"); } }); }; foo(); console.log(JSON.parse('')); //This, which has nothing to do with AJAX, works okay. //I've taken from the html document  

Reedité esto, porque no creo que sea el JSON. Mis disculpas por guiar a todos de esa manera.

 using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Runtime.Serialization; public partial class cssAttempt3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } // This method is used to convert datatable to json string [System.Web.Services.WebMethod] public static string ConvertDataTabletoString() { DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=personnet;Integrated Security=Yes;")) { using (SqlCommand cmd = new SqlCommand(@"SELECT TOP 200 * FROM personnet.dbo.accordionTest", con)) { con.Open(); SqlDataAdapter da = new SqlDataAdapter(cmd); da.Fill(dt); System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); List<Dictionary> rows = new List<Dictionary>(); Dictionary row; foreach (DataRow dr in dt.Rows) { row = new Dictionary(); foreach (DataColumn col in dt.Columns) { row.Add(col.ColumnName, dr[col]); } rows.Add(row); } return serializer.Serialize(rows); } } } } 

A partir de sus ejemplos y comentarios, es posible que su JSON no sea válido. Puede validar su salida en JSONLint . Sería de gran ayuda si mostrara cómo estaba creando su feed JSON en cssAttempt3.aspx/ConvertDataTabletoString .

Otro problema es que está utilizando JSON.parse lugar de JSON.stringify .

JSON.parse analiza una cadena como JSON.

Al contrario, JSON.stringify acepta un valor para convertir a una cadena JSON. Su valor ( response ) ya es JSON.

 function foo() { $.ajax({ type: 'POST', url: 'cssAttempt3.aspx/ConvertDataTabletoString', dataType: 'json', contentType: "application/json; charset=utf-8", success: function (response) { var t = JSON.stringify(response); var o = JSON.parse(t); //now this should work. Turns it back into what you get from url response. console.log(t); }, failure: function () { console.log("Fail"); }, error: function (jqXHR,textStatus,errorThrown) { console.log(errorThrown); //...its possibly not even JSON response at all! } }); } 

Como parte no, una forma más eficiente de crear su JSON es con un controlador ASHX … y solo llevará modificaciones menores a su código:

Agregue [DataContract] y [DataMember] a su clase (necesita una referencia a System.Runtime.Serialization para que esto funcione):

 [DataContract] public class MyDataTableClass { [DataMember] private string pro; [DataMember] private string sn; [DataMember] private string po; //etc 

Y luego haga el ASHX (haga clic con el botón derecho en su proyecto -> Agregar nuevo elemento -> Controlador genérico):

 public class ConvertDataTabletoString: IHttpHandler { public void ProcessRequest(HttpContext context) { List m = //populate MemoryStream stream = new MemoryStream(); DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(List)); s.WriteObject(stream, m); stream.Position = 0; StreamReader sr = new StreamReader(stream); context.Response.ContentType = "application/json"; context.Response.Write(sr.ReadToEnd()); } public bool IsReusable { get { return false; } } } 

luego simplemente actualice su url: url: 'ConvertDataTabletoString.ashx',

¿Se ha asegurado de marcar su método ConvertDataTabletoString con un [WebMethod] o [ScriptMethod] ?

Si no lo hace, entonces cuando solicite la página a través de Ajax, solo se manejará como si la hubiera solicitado a través de una solicitud GET de HTTP normal y se le devolverá el HTML real que genera la página aspx. Eso es lo que parece estar pasando aunque, por supuesto, podría estar equivocado.

Además, normalmente prefiero hacer que los métodos a los que quiero llamar a través de Ajax en una página aspx sean static porque esto deja en claro que no son parte de la página aspx “normal” (si no estás mezclando funcionalidad y esta página aspx solo existe para atender las solicitudes de AJAX entonces es probable que esté bien)

Editar: Olvidó mencionar, asegúrese de leer cuidadosamente el HTML que se muestra en firebug. ¡Puede que en realidad sea una página de mensaje de error del servidor web que indique que algo más está completamente mal!

En tu función de éxito pasas la variable de respuesta. Esta variable es el almacén (incluye los valores) de la respuesta que recibe de su servidor.

así que trata de seguir:

  function foo() { $.ajax({ type: "POST", url: "cssAttempt3.aspx/ConvertDataTabletoString", data: {}, dataType: 'jsonp', success: function (response) { console.log(response); //change the parse parameter to response }, failure: function () { console.log("Fail"); } }); }; 

EDITAR:

Intente usar jsonp como tipo de datos y registre la salida sin analizarlo (jsonp, analícelo por usted)

ejemplo actualizado

EDITAR 2: utilizar json.net

 using Newtonsoft.Json; List> testDictionary = new List()>(); string json = JsonConvert.SerializeObject(testDictionary); 

créditos: C # Lista A Json