2017-08-09 7 views
1

私はJSON、jqueryのデータテーブルにサーバーからこれを返すのですが、それはエラーを返します。エラーのオブジェクトをシリアル化している間に循環参照が検出されましたか?

System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'. 
    at WebServices.himher.getUsers1(Int32 iDisplayLength, Int32 iDisplayStart, Int32 iSortCol_0, String sSortDir_0, String sSearch) 

は.csコード:

public void getUsers1(int iDisplayLength, int iDisplayStart, int iSortCol_0, string sSortDir_0, string sSearch) 
{ 
    try 
    { 
     basicoperation bop = new basicoperation(); 
     DataTable dt; 

     dt = bop.getUsers(iDisplayLength, iDisplayStart, iSortCol_0, sSortDir_0, sSearch); // fetching users 

     dt.TableName = "usersDT1"; 

     //int iTotalRecords=0; 
     //int iTotalDisplayRecords= 0; 

     var retObj = new 
     { 
      iTotalRecords= 20, 
      iTotalDisplayRecords= 10, 
      aaData= dt 
     }; 

     //string json = JsonConvert.SerializeObject(dt); 

     JavaScriptSerializer js = new JavaScriptSerializer(); 

     Context.Response.Write(js.Serialize(retObj)); 
    } 
    catch (Exception ex) 
    { 

     throw ex; 
    } 
} 
+0

例外メッセージはかなり明確です。シリアル化できないデータモデルの循環参照があります。 DTOには、データテーブル全体ではなく、ビューに到達すべきデータのみを選択させる – Alex

答えて

4

問題は、あなたのretObjDataTableが含まれていること、これができないです内部に循環参照があるので、そのままJSONにシリアル化してください。

この記事では、データテーブルをシリアル化するさまざまな方法を示します。

http://www.c-sharpcorner.com/UploadFile/9bff34/3-ways-to-convert-datatable-to-json-string-in-Asp-Net-C-Sharp/

マイ好ましいのは、それはあなたがここにあなたのコードaaData= dtで循環参照を持っているかなり明確だおそらく最後の方法

using Newtonsoft.JSON; 

public string DataTableToJSONWithJSONNet(DataTable table) { 
    string JSONString=string.Empty; 
    JSONString = JSONConvert.SerializeObject(table); 
    return JSONString; 
} 
0

です。
あなたは、この問題を解決する簡単な代替文字列を返し、JavaScriptSerializerとJSONにその文字列をフォーマットすることである

JsonConvert.SerializeObject(retObj, Formatting.None, 
        new JsonSerializerSettings {ReferenceLoopHandling = 
              ReferenceLoopHandling.Ignore}); 
-1

、この問題を解決するために、コードの下に使用することができます。

public string GetEntityInJson() 
{ 
    JavaScriptSerializer j = new JavaScriptSerializer(); 
    var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute }); 
    return j.Serialize(entityList); 
} 

ビューで必要なプロパティを選択することが重要です。オブジェクトの中には親の参照があります。属性を選択しないと、テーブル全体を取り出すだけで循環参照が表示されることがあります。

public string GetEntityInJson() 
{ 
    JavaScriptSerializer j = new JavaScriptSerializer(); 
    var entityList = dataContext.Entitites.toList(); 
    return j.Serialize(entityList); 
} 

あなたがテーブル全体をしたくない場合は代わりに、これを行います:

public string GetEntityInJson() 
{ 
    JavaScriptSerializer j = new JavaScriptSerializer(); 
    var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute }); 
    return j.Serialize(entityList); 
} 

これは、あなただけの属性で、以下のデータを持つビューをレンダリングするのに役立ちます

はこれをしないでくださいあなたのウェブをより速く走らせることができます。

関連する問題