簡體   English   中英

"將 JSON 轉換為數據表"

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM