2016-07-31 198 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(); 
}