如何从C#序列化特定的Json对象

时间:2016-08-01 19:32:23

标签: c# .net json datatable

我有一个要求,我需要以下面的格式序列化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,无法以所需格式创建。感谢。

2 个答案:

答案 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>,其中包含columnsrows两个项目。 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());