【问题标题】:How To Fix Circular Reference Error When Dealing With Json处理 Json 时如何修复循环引用错误
【发布时间】:2012-09-25 14:20:23
【问题描述】:

这个问题是我在这里Get Data Into 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.js 时得到了没有数据的 gridview 表,但是如果我像这样直接访问控制器的方法

http://localhost:55099/GridView/writeRecord

我收到此错误,

在序列化“System.Globalization.CultureInfo”类型的对象时检测到循环引用。 说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息: System.InvalidOperationException:在序列化“System.Globalization.CultureInfo”类型的对象时检测到循环引用。

有人可以帮忙吗..

【问题讨论】:

    标签: c# json asp.net-mvc-3 extjs circular-reference


    【解决方案1】:

    我使用以下工具对 JSON 进行序列化和反序列化:

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

    它非常易于使用且非常轻便。

    在序列化时我们使用这个选项:

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

    它忽略循环引用。

    newtonking 的 json.net 也非常快。

    其他选项是使用 DTO 并通过 Diver 提到的 Automapper 映射它们。

    编辑:我怀疑你的商店是错误的:

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

    【讨论】:

    • 感谢您的回答约翰哈斯特。我很抱歉我对这一切都不熟悉。您能否解释一下我需要在哪里使用上述选项。非常感谢
    • 不知道 MVC3 的情况如何,但使用 MVC4 JSON.net 将成为 JSON 的默认序列化程序
    • 另外,它说 JsonConvert 不存在....我使用 System.Web.Script.Serialization;
    • Jackson,您需要从他们的网站下载 json.net dll 并将其添加为您项目的参考。然后你就可以使用它了。您将在返回 Json(myData ...
    • 谢谢约翰...这样做了,现在错误消失了,我的 json 格式现在看起来像这样...调查完成!"{\"myTable\":[{\"Q1\" :\"1\",\"Q2\":\"1\",\"Q3\":\"1\",\"Q4\":\"1\",\"改进\":\ "\",\"评论\":\"1\"},{\"Q1\":\"1\",\"Q2\":\"2\",\"Q3\":\" 3\",\"Q4\":\"4\",\"改进\":\"Iphone5\",\"评论\":\"Iphone14\"},{\"Q1\":\" 1\",\"Q2\":\"1\",\"Q3\":\"3\",\"Q4\":\"3\",\"改进\":\"这是Comment1-3\",\"Comments\":\"This is Comment2-3\"}]}"... 但仍然无法在我的网格视图中找到它
    【解决方案2】:

    这是因为 CultureInfo 内部的某些内容对自身(这种类型)有引用,并且在转换为 JSON 的过程中它失败了。 为避免这种情况,您应该使用 ViewModels(仅返回客户端所需的信息)。 你可以在这里阅读更多 http://blogs.msdn.com/b/dphill/archive/2009/01/31/the-viewmodel-pattern.aspx

    在您的情况下,您应该为您的数据创建 ViewModel,将您的数据转换为这些数据类型,然后将它们转换为 JSON。为了从 Model 转换到 ViewModel 考虑使用 AutoMapper http://automapper.codeplex.com/ 或一些类似的工具。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多