2016-07-31 168 views
1

在发布此问题之前,我尝试了其他相关帖子,但没有解决,因此在此发布。将JSON对象转换为C#列表

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

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

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和检索数据作为模型类的列表的代码:

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); 
} 

模型类。

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}]" 
+0

看来你的值设置为JavaScript对象,而不是一个JSON字符串 - 其实,你要创建一个JSON字符串硬盘的方式,然后解析它...将JSON传递到服务器,你会JSON.stringify一个JavaScript对象导致一个JSON字符串 –

+0

'获得的JSON字符串最有可能'[object Object]' –

+0

我试过使用JSON .stringify但不能将List解析为Json,并在脚本中引发错误...您可以通过其他简单的方法来实现上述功能吗? – zainul

回答

2

创建list作为数组和添加的项目,如JavaScript对象,然后使用JSON.stringify

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 - 将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); 
} 
+2

为什么不简化这个更多和使用['阵列。 prototype.map()'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map):[fiddle](https://jsfiddle.net/xemmm9y9 /) – Andreas

+0

哇...感谢Nkosi ...它的工作..你的代码更改中的一个小改动= to:在制作JSON对象.ie时。姓名:而不是姓名= – zainul

+0

@zainul,很高兴帮助。感谢更新。在我的部分错别字。 Andreas简化列表的建议也非常好。快乐编码! – Nkosi

1

我认为这会做

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(); 
}