[英]How to serialize specific Json object from C#
我有一个需要以以下格式序列化json
对象的要求
[{
"columns": [{
"title": "NAME"
}, {
"title": "COUNTY"
}],
"data": [
["John Doe", "Fresno"],
["Billy", "Fresno"],
["Tom", "Kern"],
["King Smith", "Kings"]
]
}]
在这里,我需要从两个不同的来源获取这个json对象,一个是Columns
,另一个是data
。 列将来自一个string
,该string
将以逗号分隔为
string columnNames = "Name, County";
和data
将来自.net Datatable像
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我的回答创建一个类从长远来看更干净,更容易维护。
如果您以逗号分隔的列名列表开头,那么实际上应该没有什么难做的。 就像是:
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.