我有一个要求,我需要以下面的格式序列化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,如
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
,无法以所需格式创建。感谢。
答案 0 :(得分:2)
我通常做的是,我根据数据构建模型,并序列化该模型。
这就是我想象你的模型的样子。
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);
我确定你可以弄清楚如何根据你的真实数据创建该模型。这并不难。
答案 1 :(得分:1)
创建课程可能更容易,但如果您想使用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());