Как исправить круговую ошибку ссылки при работе с Json

Этот вопрос является частью моего первоначального сообщения здесь. Получить данные в Extjs GridPanel

Ниже мой контроллер, который читает данные из sql db, а затем я пытаюсь кодировать результат как JSON и отправлять данные обратно в 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();

    } 

Здесь проблема, с приведенным выше кодом, я получаю таблицу gridview без данных при выполнении gridview.js, но если я непосредственно получаю доступ к моему методу контроллера, подобному этому

http://localhost:55099/GridView/writeRecord

Я получаю эту ошибку,

Круговая ссылка была обнаружена при сериализации объекта типа "System.Globalization.CultureInfo". Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде. Сведения об исключении: System.InvalidOperationException: круговая ссылка была обнаружена при сериализации объекта типа "System.Globalization.CultureInfo".

Может кто-то, пожалуйста, помогите..

Ответ 1

Я использую следующий инструмент для сериализации и десериализации JSON:

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

Он очень прост в использовании и очень легкий.

При сериализации мы используем эту опцию:

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

Он игнорирует циклические ссылки.

Также json.net от newtonking работает очень быстро.

Другие варианты - использовать DTO и сопоставлять их с помощью Automapper, как упомянуто Diver.

Изменение: я подозреваю, что ваш магазин ошибочен:

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

Ответ 2

Это потому, что что-то внутри CultureInfo имеет ссылку на себя (этот тип) и в процессе преобразования в JSON он терпит неудачу. Чтобы избежать этой ситуации, вы должны использовать ViewModels (возврат в клиентскую информацию, которая необходима). Вы можете прочитать больше здесь http://blogs.msdn.com/b/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

В вашей ситуации вы создаете ViewModels для своих данных, конвертируете свои данные в эти типы данных и возвращаете их в JSON. Для преобразования из Model в ViewModel рассмотрите возможность использования AutoMapper http://automapper.codeplex.com/ или какого-либо подобного инструмента.