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