[英]Convert JSON to DataTable
我有以下格式的 JSON:
[
{"id":"10","name":"User","add":false,"edit":true,"authorize":true,"view":true},
{"id":"11","name":"Group","add":true,"edit":false,"authorize":false,"view":true},
{"id":"12","name":"Permission","add":true,"edit":true,"authorize":true,"view":true}
]
這里有一個比其他答案更簡單的方法,需要先反序列化為 ac# 類,然后將其轉換為數據表。
可以使用 JSON.NET 和如下代碼直接訪問數據表:
DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));
將您的 jsonstring 反序列化為某個類
List<User> UserList = JsonConvert.DeserializeObject<List<User>>(jsonString);
也可以使用下面的代碼來實現。
DataSet data = JsonConvert.DeserializeObject<DataSet>(json);
人們並不總是知道要反序列化的類型。 因此,能夠獲取任何 JSON(包含一些數組)並從中動態生成一個表會很方便。
然而,可能會出現一個問題,即反序列化器不知道在哪里查找要制表的數組。 發生這種情況時,我們會收到類似於以下內容的錯誤消息:
讀取 DataTable 時出現意外的 JSON 令牌。 預期 StartArray,得到 StartObject。 路徑'',第 1 行,位置 1。
即使我們給予鼓勵或相應地准備我們的 json,數組中的“對象”類型仍然可以防止制表的發生,其中反序列化器不知道如何用行等表示對象。在這種情況下,出現類似以下的錯誤:
讀取 DataTable 時出現意外的 JSON 令牌:StartObject。 路徑 '[0].__metadata',第 3 行,位置 19。
下面的示例 JSON 包含這兩個有問題的功能:
那么我們如何解決這個問題,並且仍然保持不知道要反序列化的類型的靈活性呢?
好吧,這是我想出的一個簡單方法(假設您很樂意忽略對象類型的屬性,例如上面示例中的 __metadata):
我知道這可能更“LINQy”,並且異常處理絕對為零,但希望能傳達這個概念。
我們開始在我的工作中使用越來越多的服務來返回 JSON,因此將自己從強類型化中解放出來是我的明顯偏好,因為我很懶!
我建議您使用JSON.NET 。 它是一個開源庫,可將您的 c# 對象序列化和反序列化為 json 和 Json 對象為 .net 對象...
序列化示例:
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string json = JsonConvert.SerializeObject(product);
//{
// "Name": "Apple",
// "Expiry": new Date(1230422400000),
// "Price": 3.99,
// "Sizes": [
// "Small",
// "Medium",
// "Large"
// ]
//}
Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
這是使用Cinchoo ETL (一個開源庫)將 JSON 轉換為 Datatable 的另一種無縫方法
下面的示例顯示了如何轉換
string json = @"[
{""id"":""10"",""name"":""User"",""add"":false,""edit"":true,""authorize"":true,""view"":true},
{ ""id"":""11"",""name"":""Group"",""add"":true,""edit"":false,""authorize"":false,""view"":true},
{ ""id"":""12"",""name"":""Permission"",""add"":true,""edit"":true,""authorize"":true,""view"":true}
]";
using (var r = ChoJSONReader.LoadText(json))
{
var dt = r.AsDataTable();
}
小提琴示例: https ://dotnetfiddle.net/y0siCi
json = File.ReadAllText(System.AppDomain.CurrentDomain.BaseDirectory + "App_Data\\" +download_file[0]);
DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable)));
我通過以下方法解決了這個問題 - 下面使用了 Pravin Pawar 的答案 - 將 JSON 對象轉換為 dt。
https:\/\/stackoverflow.com\/a\/11982180\/504351<\/a>
1) 將 JSON 從 Angular 發送到 C# 控制器方法。 2)在 C# 控制器方法中 -
將字符串數據(JSON 對象)轉換為數據表。
DataTable dt = (DataTable)JsonConvert.DeserializeObject(data, (typeof(DataTable)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.