在 LINQ 當道的時代雖然 DataTable 比較少用了,但還是難免會碰到, 下面紀錄如何在.NET Core 裡面把 DataTable 的資料轉成 JsonElement,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public JsonElement jsonFromDataTable(DataTable dt) {
    using (var stream = new MemoryStream()) {
        using (var writer = new Utf8JsonWriter(stream)) {
            // 起始一個裝 JElement 的陣列
            writer.WriteStartArray(); 
            foreach (DataRow row in dt.Rows) {
                // 開始寫入每個 Row 各自對應的 JElement 寫入程序
                writer.WriteStartObject(); 
                foreach (DataColumn column in row.Table.Columns) {
                    // 先寫入屬性名稱
                    writer.WritePropertyName(column.ColumnName);
                    // 判斷欄位值是否為 DBNull 來寫入值或 Null
                    if (row[column.ColumnName] == DBNull.Value)
                        writer.WriteNullValue();
                    else
                        JsonSerializer.Serialize(writer, row[column]);
                }
                // 結束一列資料對應的 JElement 寫入程序
                writer.WriteEndObject();
            }
            // 結束整個陣列的寫入
            writer.WriteEndArray();
        }
        // 最後 Stream 讀取的資料會寫成 JsonDocument 的 RootElement
        return JsonDocument.Parse( stream.ToArray() ).RootElement;
    }
}

使用方式:

1
2
3
4
DataTable dt = new DataTable();
// 下略對 dt 一連串操作
// 直接把 DataTable 轉換成 JsonElement
JsonElement je = jsonFromDataTable(dt);