繁体   English   中英

将JSON对象转换为C#列表

[英]Converting JSON object into C# list

在发布此问题之前,我尝试了其他相关帖子,但它没有成功,所以发布在这里。

我有一个Json存储在一个隐藏的字段中,我在我的标记页面的代码后面访问。 我需要将这个Json转换为List并将其绑定到网格,但是在反序列化时抛出错误,说"Unexpected error encountered while parsing values ''"

用于从网格获取数据并生成Json对象的脚本。

function BeforeSorting() {
    var list = UpdateDataSource();
    $("#SortingField").val(list);
}

function UpdateDataSource() {
    var list="";
    var grid = $find("DetailsGrid");
    var rows = grid.get_rows();
    for(var i =0 ; i<rows.get_length();i++){
        var name = rows.get_row(i).get_cellByColumnKey("Name").get_value();
        var country = rows.get_row(i).get_cellByColumnKey("Country").get_value();
        var gender = rows.get_row(i).get_cellByColumnKey("Gender").get_value();
        var age = rows.get_row(i).get_cellByColumnKey("Age").get_value();
        var uniqueKey = rows.get_row(i).get_cellByColumnKey("UniqueKey").get_value();

        list = list + '{"Name":"' + name + '", "Country":"' + country + '", "Gender":"' + gender + '", "Age":' + age + ', "UniqueKey":' + uniqueKey + '},';
    }
    list = "["+list.substr(0, list.length - 1)+"]";
    return JSON.parse(list);
}

模型类:

public class Details
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public string Country { get; set; }
    public int UniqueKey { get; set; }
    public int Age { get; set; }
}

用于反序列化json并将数据作为模型类列表检索的代码。

protected void DetailsGrid_ColumnSorted(object sender, Infragistics.Web.UI.GridControls.SortingEventArgs e)
{
    var dataSource = SortingField.Value;
    List<Details> result = (List<Details>)Newtonsoft.Json.JsonConvert.DeserializeObject(dataSource, typeof(List<Details>));
    DetailsGrid.DataSource = result;
    DetailsGrid.DataBind();
}

获得的json字符串:

"[{"Name":"Jerry", "Country":"U.S.A.", "Gender":"Male", "Age":20, "UniqueKey":1},{"Name":"Tom", "Country":"U.K", "Gender":"Male", "Age":10, "UniqueKey":2},{"Name":"George", "Country":"Gremany", "Gender":"Male", "Age":38, "UniqueKey":3},{"Name":"Kate", "Country":"France", "Gender":"Female", "Age":40, "UniqueKey":4},{"Name":"Jenny", "Country":"Poland", "Gender":"Female", "Age":25, "UniqueKey":5}]"

list创建为数组并将项目添加为JavaScript对象,然后使用JSON.stringify将其转换为JSON

function UpdateDataSource() {        
    var grid = $find("DetailsGrid");
    var rows = grid.get_rows();
    var list = [];
    for(var i =0 ; i < rows.get_length(); i++){
        var item = {
            Name : rows.get_row(i).get_cellByColumnKey("Name").get_value(),
            Country : rows.get_row(i).get_cellByColumnKey("Country").get_value(),
            Gender : rows.get_row(i).get_cellByColumnKey("Gender").get_value(),
            Age : rows.get_row(i).get_cellByColumnKey("Age").get_value(),
            UniqueKey : rows.get_row(i).get_cellByColumnKey("UniqueKey").get_value()
        };

        list.push(item);
    }
    return JSON.stringify(list);
}

用于反序列化json并将数据作为模型类列表检索的代码可以重构为

protected void DetailsGrid_ColumnSorted(object sender, Infragistics.Web.UI.GridControls.SortingEventArgs e) {
    var dataSource = SortingField.Value;
    var result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Details>>(dataSource);
    DetailsGrid.DataSource = result;
    DetailsGrid.DataBind();
}

@Adnreas建议的更新应该产生相同的结果。

function UpdateDataSource() {        
    var grid = $find("DetailsGrid");
    var rows = grid.get_rows();
    var list = rows.map(function(row) {
        return {
            Name: row.get_cellByColumnKey("Name").get_value(),
            Country: row.get_cellByColumnKey("Country").get_value(),
            Gender: row.get_cellByColumnKey("Gender").get_value(),
            Age: row.get_cellByColumnKey("Age").get_value(),
            UniqueKey: row.get_cellByColumnKey("UniqueKey").get_value()
        };
    });
    return JSON.stringify(list);
}

我认为这样做

protected void DetailsGrid_ColumnSorted(object sender, Infragistics.Web.UI.GridControls.SortingEventArgs e)
{
    var dataSource = SortingField.Value;
    List<Details> result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Details>>(dataSource);
    DetailsGrid.DataSource = result;
    DetailsGrid.DataBind();
}

暂无
暂无

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

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