如何从 C# 序列化特定的 Json 对象
本文关键字:Json 对象 序列化 | 更新日期: 2023-09-27 17:59:40
我有一个要求,我需要以以下格式序列化json
对象
[{
"columns": [{
"title": "NAME"
}, {
"title": "COUNTY"
}],
"data": [
["John Doe", "Fresno"],
["Billy", "Fresno"],
["Tom", "Kern"],
["King Smith", "Kings"]
]
}]
在这里,我需要从两个不同的来源获取这个json对象,一个是Columns
,另一个是data
。列将来自一个string
该将以逗号分隔为
string columnNames = "Name, County";
data
将来自 .net 数据表,例如
DataTable dt = new DataTable();
我尝试使用以下代码使用JavaScriptSerializer
但我无法将其格式化为所需的格式。实际上,动态创建 jquery 数据表需要共享格式。这是我在 C# 中的原始代码。
[WebMethod]
public static string ConvertDatadttoString(string appName)
{
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("County", typeof(string));
dt.Rows.Add("vo", "go.com");
dt.Rows.Add("pa", "pa.com");
System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary<string, object> row;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
上面的代码只是序列化DataTable
,无法以所需的格式创建。谢谢。
我通常做的是,我基于数据构建一个模型,并序列化该模型。
这就是我想象你的模型的样子。
public class SampleClass
{
public IEnumerable<SampleItem> columns { get; set; }
public IEnumerable<IEnumerable<string>> data { get; set; }
}
public class SampleItem
{
public string title { get; set; }
}
这就是我想象你会得到示例 json 的方式
var sample = new List<SampleClass>
{
new SampleClass()
{
columns = new List<SampleItem>()
{
new SampleItem() {title = "NAME" },
new SampleItem() {title = "COUNTY" },
},
data = new List<List<string>>()
{
new List<string> { "John Doe", "Fresno" },
new List<string> { "Billy", "Fresno" },
new List<string> { "Tom", "Kern" },
new List<string> { "King Smith", "Kings" },
}
}
};
var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(sample);
我相信你可以弄清楚如何根据你的真实数据创建该模型。 这并不难。
创建类可能更容易,但是如果要使用Dictionary<string,object>
,则需要首先为列添加一个条目:
rows["columns"] = dt.Columns.Cast<DataTableColumn>()
.Select(c => new { title = c.ColumnName }).ToList();
然后,您可以使用以下内容添加数据:
rows["data"] = dt.Rows.Cast<DataRow>.Select(r => r.ItemArray).ToList();
现在,您有一个包含两个项目的Dictionary<string,object>
columns
和 rows
。 columns
包含具有属性 title
的对象集合,rows
只包含每行的数组数组。
但这是一个快速而肮脏的解决方案。我认为从长远来看,根据 @Sam I 的答案创建一个类更干净、更容易维护。
如果您从逗号分隔的列名列表开始,那么这样做真的应该不难。 像这样:
var columns = columnNames.Split(","); // beware of column names that include commas!
row["columns"] = columns.Select(c => new { title = c });
row["data"] = dt.Rows.Cast<DataRow>.Select(r => columns.Select(c => r[c]).ToList());