Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Javascript序列化程序将数据表序列化为JSON时出错_C#_Json_Serialization - Fatal编程技术网

C# 使用Javascript序列化程序将数据表序列化为JSON时出错

C# 使用Javascript序列化程序将数据表序列化为JSON时出错,c#,json,serialization,C#,Json,Serialization,我有一门课 public class Parameters { public int Id {get;set;} public string FilterParam {get;set;} public string NameParam {get;set;} public IList<int> CollectionsIds {get;set;} public DataTable ParamTable {get;set;} } 公共类参数 { 公共int

我有一门课

public class Parameters
{
   public int Id {get;set;}
   public string FilterParam {get;set;}
   public string NameParam {get;set;}
   public IList<int> CollectionsIds {get;set;}
   public DataTable ParamTable {get;set;}
}
公共类参数
{
公共int Id{get;set;}
公共字符串FilterParam{get;set;}
公共字符串NameParam{get;set;}
公共IList集合ID{get;set;}
公共数据表ParamTable{get;set;}
}
当我尝试序列化为JSON时,我得到循环引用错误“序列化对象时检测到循环引用”

我的序列化程序代码是:

JSONSerializer.SerializeObject<Parameters>(parameters)

private static JavaScriptSerializer _jsonSerializer = null;
private static JavaScriptSerializer JSONSerializer
{
    get
    {
        if (_jsonSerializer == null)
        {
            _jsonSerializer = new JavaScriptSerializer();
            _jsonSerializer.MaxJsonLength = 999999999;
        }
        return _jsonSerializer;
    }
}

public static string SerializeObject<T>(T obj)
{
    return JSONSerializer.Serialize(obj);
}
JSONSerializer.SerializeObject(参数)
私有静态JavaScriptSerializer_jsonSerializer=null;
私有静态JavaScriptSerializer JSONSerializer
{
得到
{
if(_jsonSerializer==null)
{
_jsonSerializer=新的JavaScriptSerializer();
_jsonSerializer.MaxJsonLength=9999999;
}
返回式jsonSerializer;
}
}
公共静态字符串序列化对象(T obj)
{
返回JSONSerializer.Serialize(obj);
}
如果类也包含dataTable,如何将该类序列化为JSON格式

注意:如果我将dataTable设置为null,它可以正常工作,但每当我尝试填充dataTable并调用方法序列化它时,都会失败。

使用此库:

此JSON:

{
 Parameters :
 {
   id: 1,
   FilterParam: "2",
   NameParam: "2",
   CollectionsIds: [1,2,3,1],
   ParamTable: {id:1,name:2,code:"3"}
 }
}
将有类():

p

公共类参数表 { 公共int id{get;set;} 公共int名称{get;set;} 公共字符串代码{get;set;} } 公共类参数 { 公共int id{get;set;} 公共字符串FilterParam{get;set;} 公共字符串NameParam{get;set;} 公共列表集合ID{get;set;} 公共参数表ParamTable{get;set;} } 公共类根对象 { 公共参数参数{get;set;} } 因此,您将以如下方式小口序列化您想要的内容:

JsonConvert.DeserializeObject<RootObject>(myJSON);
JsonConvert.DeserializeObject(myJSON);
只需添加一个字段(字典列表)即可在类中伪造
数据表。并忽略
DataTable
成员。然后可以根据需要序列化此类的对象

public class Parameters
{
    public int Id {get;set;}
    public string FilterParam {get;set;}
    public string NameParam {get;set;}
    public IList<int> CollectionsIds {get;set;}
    [ScriptIgnore]
    public DataTable ParamTable {get;set;}

    public List<Dictionary<string, object>> _fakeParamTable
    {
        get
        {
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;

            foreach ( DataRow dr in ParamTable .Rows )
            {
                row = new Dictionary<string, object>();
                foreach ( DataColumn col in dt.Columns )
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }
            return rows;
        }
    }
}
公共类参数
{
公共int Id{get;set;}
公共字符串FilterParam{get;set;}
公共字符串NameParam{get;set;}
公共IList集合ID{get;set;}
[脚本忽略]
公共数据表ParamTable{get;set;}
公共列表_fakeParamTable
{
得到
{
列表行=新列表();
字典行;
foreach(ParamTable.Rows中的数据行dr)
{
行=新字典();
foreach(dt.列中的数据列列列)
{
行添加(列名称,dr[col]);
}
行。添加(行);
}
返回行;
}
}
}

I thin Paramtable与Parameters类中的字段相同。看看这个,忽略
DataTable
就足够了吗?@Tolga不,我需要将DataTable与类参数一起存储到JSON。在最坏的情况下,我可能需要通过创建对应于DataTable的类来解决问题。但是我试图为现有的类结构找到一个解决方案。一个V2Solutions,它的DataTable和name是完全不同的。我的意思是datatable的列名不同于类参数中声明的属性。我知道这种方法。如果绝对没有将dataTable修复为JSON的解决方案,我将其作为最坏情况。这是我最后一次希望将dataTable转换为meaningfull类,然后调用Serializer代码。只需使用SerializationBinder即可实现JSON,您将在那里找到:
public class Parameters
{
    public int Id {get;set;}
    public string FilterParam {get;set;}
    public string NameParam {get;set;}
    public IList<int> CollectionsIds {get;set;}
    [ScriptIgnore]
    public DataTable ParamTable {get;set;}

    public List<Dictionary<string, object>> _fakeParamTable
    {
        get
        {
            List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
            Dictionary<string, object> row;

            foreach ( DataRow dr in ParamTable .Rows )
            {
                row = new Dictionary<string, object>();
                foreach ( DataColumn col in dt.Columns )
                {
                    row.Add(col.ColumnName, dr[col]);
                }
                rows.Add(row);
            }
            return rows;
        }
    }
}