una serializar referencia objeto detectó c# json asp.net-mvc-3 extjs circular-reference

serializar - referencia circular c#



Cómo arreglar el error de referencia circular cuando se trata de Json (2)

Esta pregunta es parte de mi publicación original aquí Obtener datos en Extjs GridPanel

Debajo está mi Controlador que lee los datos de sql db y luego estoy tratando de codificar el resultado como JSON y enviar los datos a mi gridview.js

public JsonResult writeRecord() //public string writeRecord() { Response.Write("Survey Completed!"); SqlConnection conn = DBTools.GetDBConnection("ApplicationServices2"); string sqlquery = "SELECT Q1, Q2, Q3, Q4, Improvements, Comments FROM myTable"; SqlDataAdapter cmd = new SqlDataAdapter(sqlquery, conn); DataSet myData = new DataSet(); cmd.Fill(myData, "myTable"); conn.Open(); conn.Close(); return Json(myData, JsonRequestBehavior.AllowGet); //return myData.GetXml(); }

Aquí radica el problema, con el código anterior, obtengo mi tabla gridview sin datos al ejecutar gridview.js, pero si tengo acceso directo al método de mi controlador como este

http://localhost:55099/GridView/writeRecord

Me sale este error,

Se detectó una referencia circular al serializar un objeto de tipo ''System.Globalization.CultureInfo''. Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código. Detalles de la excepción: System.InvalidOperationException: se detectó una referencia circular al serializar un objeto de tipo ''System.Globalization.CultureInfo''.

Puede ayudarme alguien, por favor..


Se debe a que algo dentro de CultureInfo tiene una referencia a sí mismo (este tipo) y en proceso de conversión a JSON falla. Para evitar esta situación, debe usar ViewModels (devolver al cliente solo la información que se necesita). Puedes leer más aquí http://blogs.msdn.com/b/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

En su situación, debe crear ViewModels para sus datos, convertir sus datos a estos tipos de datos y devolverlos convertidos a JSON. Con el propósito de convertir de Model a ViewModel, considere usar AutoMapper http://automapper.codeplex.com/ o alguna herramienta similar.


Utilizo la siguiente herramienta para serializar y deserializar JSON:

http://james.newtonking.com/pages/json-net.aspx

Es muy fácil de usar y muy liviano.

Al serializar usamos esta opción:

JsonConvert.SerializeObject(myObject, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore })

Ignora las referencias circulares.

También json.net de newtonking es extremadamente rápido.

La otra opción es usar los DTO y asignarlos a través de Automapper como lo mencionó Diver.

Editar: sospecho que tu tienda está equivocada:

var store = Ext.create(''Ext.data.JsonStore'', { storeId: ''myData'', reader: new Ext.data.JsonReader({ root: ''myTable'', fields: [{ name: ''Q1'', type: ''int'' }, { name: ''Q2'', type: ''int'' }, { name: ''Q3'', type: ''int'' }, { name: ''Q4'', type: ''int'' }, { name: ''Q5'', type: ''int'' }, { name: ''Improvements'', type: ''string'' }, { name: ''Comments'', type: ''string''}] }), proxy: { type: ''json'', url: ''GridView/writeRecord'' } });