如何从 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,无法以所需的格式创建。谢谢。

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

我通常做的是,我基于数据构建一个模型,并序列化该模型。

这就是我想象你的模型的样子。

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> columnsrowscolumns 包含具有属性 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());