繁体   English   中英

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

[英]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>其中有两个项目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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM