Datatable和實體集合互轉

1.使用已廢棄的 JavaScriptSerializer,且反序列化為弱類型 ArrayList。可用但不推薦。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Script.Serialization;namespace Helper
{public static class DataTableHelper{// 將JSON字符串轉換為DataTablepublic static DataTable JsonToDataTable(string json){DataTable dataTable = new DataTable();try{JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();javaScriptSerializer.MaxJsonLength = Int32.MaxValue;ArrayList arrayList = javaScriptSerializer.Deserialize<ArrayList>(json);if (arrayList.Count > 0){foreach (Dictionary<string, object> dic in arrayList){if (dic.Keys.Count == 0) return dataTable;if (dataTable.Columns.Count == 0){foreach (string current in dic.Keys){Type tp = dic[current]?.GetType() ?? typeof(string);dataTable.Columns.Add(current, tp);}}DataRow datarow = dataTable.NewRow();foreach (string current in dic.Keys){datarow[current] = dic[current] ?? DBNull.Value;}dataTable.Rows.Add(datarow);}}}catch { }return dataTable;}// 將DataTable轉換為泛型實體列表public static List<T> ConvertToEntity<T>(this DataTable table) where T : new(){List<T> list = new List<T>();foreach (DataRow row in table.Rows){T entity = new T();foreach (PropertyInfo prop in typeof(T).GetProperties()){if (table.Columns.Contains(prop.Name.ToUpper())){object value = row[prop.Name.ToUpper()];if (value != DBNull.Value){// 處理decimal/double轉string的特殊情況if ((prop.PropertyType == typeof(string)) &&(value is decimal || value is double)){prop.SetValue(entity, Convert.ChangeType(value, prop.PropertyType));}else if ((prop.PropertyType == typeof(int) || prop.PropertyType == typeof(long)) &&(value is decimal || value is double)){prop.SetValue(entity, Convert.ChangeType(value, prop.PropertyType));}else{prop.SetValue(entity, value);}}}}list.Add(entity);}return list;}// 將DataRow轉換為泛型實體public static T ConvertToEntity<T>(this DataRow row) where T : new(){DataTable dt = new DataTable();dt.Rows.Add(row);return ConvertToEntity<T>(dt).FirstOrDefault();}// 將泛型列表轉換為DataTablepublic static DataTable ConvertToDataTable<T>(this List<T> list){DataTable table = new DataTable();if (list == null || list.Count == 0) return table;foreach (PropertyInfo prop in typeof(T).GetProperties()){table.Columns.Add(prop.Name.ToUpper(),Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);}foreach (T entity in list){DataRow row = table.NewRow();foreach (PropertyInfo prop in typeof(T).GetProperties()){object value = prop.GetValue(entity, null);row[prop.Name.ToUpper()] = value ?? DBNull.Value;}table.Rows.Add(row);}return table;}// 將泛型模型轉換為DataRowpublic static DataRow ConvertToDataRow<T>(this T model){DataTable table = new DataTable();if (model == null) return null;foreach (PropertyInfo prop in typeof(T).GetProperties()){table.Columns.Add(prop.Name.ToUpper(),Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);}DataRow row = table.NewRow();foreach (PropertyInfo prop in typeof(T).GetProperties()){object value = prop.GetValue(model, null);row[prop.Name.ToUpper()] = value ?? DBNull.Value;}table.Rows.Add(row);return table.Rows[0];}}
}

2.使用 Newtonsoft.Json.Linq.JArray 解析 JSON,支持復雜結構和動態類型。推薦

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;namespace Helper
{public static class DataTableHelper{// 將JSON字符串轉換為DataTablepublic static DataTable JsonToDataTable(string json){var dataTable = new DataTable();try{var jsonArray = JArray.Parse(json);if (jsonArray.Count == 0) return dataTable;// 初始化列var firstItem = jsonArray.First.ToObject<Dictionary<string, object>>();foreach (var key in firstItem.Keys){dataTable.Columns.Add(key, GetDataType(firstItem[key]));}// 填充數據foreach (var item in jsonArray){var row = dataTable.NewRow();foreach (var key in item.Properties()){var columnName = key.Name;var value = key.Value?.ToString() ?? DBNull.Value;row[columnName] = ConvertValue(value, dataTable.Columns[columnName].DataType);}dataTable.Rows.Add(row);}}catch (Exception ex){// 記錄異常(實際項目中使用日志組件)Console.WriteLine($"JSON轉DataTable失敗: {ex.Message}");}return dataTable;}// 將DataTable轉換為泛型實體列表public static List<T> ConvertToEntity<T>(this DataTable table) where T : new(){var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance).ToList();var list = new List<T>();foreach (DataRow row in table.Rows){var entity = new T();foreach (var prop in properties){if (!table.Columns.Contains(prop.Name) && !table.Columns.Contains(prop.Name.ToUpper()))continue;var columnName = table.Columns[prop.Name] != null ? prop.Name : table.Columns.Cast<DataColumn>().FirstOrDefault(c => c.ColumnName.Equals(prop.Name, StringComparison.OrdinalIgnoreCase))?.ColumnName;if (columnName == null) continue;var value = row[columnName];if (value == DBNull.Value){if (prop.PropertyType.IsValueType && Nullable.GetUnderlyingType(prop.PropertyType) == null)continue; // 跳過非可空值類型的DBNullvalue = null;}try{prop.SetValue(entity, Convert.ChangeType(value, prop.PropertyType));}catch (Exception ex){Console.WriteLine($"屬性 {prop.Name} 轉換失敗: {ex.Message}");}}list.Add(entity);}return list;}// 將DataRow轉換為泛型實體public static T ConvertToEntity<T>(this DataRow row) where T : new(){var dt = new DataTable();dt.Rows.Add(row.ItemArray);return dt.ConvertToEntity<T>().FirstOrDefault();}// 將泛型列表轉換為DataTablepublic static DataTable ConvertToDataTable<T>(this List<T> list){if (list == null || list.Count == 0) return new DataTable();var dataTable = new DataTable();var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);foreach (var prop in properties){dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);}foreach (var entity in list){var row = dataTable.NewRow();foreach (var prop in properties){var value = prop.GetValue(entity) ?? DBNull.Value;row[prop.Name] = value;}dataTable.Rows.Add(row);}return dataTable;}// 輔助方法:獲取值的類型private static Type GetDataType(object value){if (value == null) return typeof(string);return value.GetType();}// 輔助方法:安全轉換值類型private static object ConvertValue(object value, Type targetType){if (value == DBNull.Value) return null;if (targetType.IsEnum)return Enum.Parse(targetType, value.ToString());if (targetType == typeof(DateTime) && value is string str)return DateTime.Parse(str);return Convert.ChangeType(value, targetType);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83554.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83554.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83554.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里云服務器ECS詳解:云服務器是什么,云服務器優勢和應用場景及參考

云服務器ECS是阿里云眾多云產品中&#xff0c;最受用戶關注的產品&#xff0c;阿里云服務器提供多樣化的計算能力&#xff0c;支持x86、Arm架構&#xff0c;涵蓋CPU、GPU等多種服務器類型&#xff0c;滿足各種用戶需求。其便捷易用特性包括分鐘級交付、通用API和性能監控框架&a…

【Oracle】游標

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. 游標基礎概述1.1 游標的概念與作用1.2 游標的生命周期1.3 游標的分類 2. 顯式游標2.1 顯式游標的基本語法2.1.1 聲明游標2.1.2 帶參數的游標 2.2 游標的基本操作2.2.1 完整的游標操作示例 2.3 游標屬性2.3.1…

pikachu靶場通關筆記11 XSS關卡07-XSS之關鍵字過濾繞過(三種方法滲透)

目錄 一、源碼分析 1、進入靶場 2、代碼審計 3、攻擊思路 二、滲透實戰 1、探測過濾信息 2、注入Payload1 3、注入Payload2 4、注入Payload3 本系列為通過《pikachu靶場通關筆記》的XSS關卡(共10關&#xff09;滲透集合&#xff0c;通過對XSS關卡源碼的代碼審計找到安…

XML 元素:基礎、應用與優化

XML 元素:基礎、應用與優化 引言 XML(可擴展標記語言)作為一種數據交換的標準格式,廣泛應用于互聯網數據交換、數據存儲等領域。XML 元素是 XML 文檔的核心組成部分,本文將深入探討 XML 元素的概念、特性、應用以及優化方法。 一、XML 元素概述 1.1 XML 元素的定義 X…

【Axure高保真原型】交通事故大屏可視化分析案例

今天和大家分享交通事故大屏可視化分析案例的原型模板&#xff0c;包括餅圖分類分析、動態顯示發生數、柱狀圖趨勢分析、中部地圖展示最新事故發現地點和其他信息、右側列表記錄發生事故的信息…… 通過多種可視化圖表展示分析結果&#xff0c;具體效果可以點擊下方視頻觀看或…

HCIP(BGP基礎)

一、BGP 基礎概念 1. 網絡分類與協議定位 IGP&#xff08;內部網關協議&#xff09;&#xff1a;用于自治系統&#xff08;AS&#xff09;內部路由&#xff0c;如 RIP、OSPF、EIGRP&#xff0c;關注選路效率、收斂速度和資源占用。EGP&#xff08;外部網關協議&#xff09;&a…

【HarmonyOS 5】 ArkUI-X開發中的常見問題及解決方案

一、跨平臺編譯與適配問題 1. 平臺特定API不兼容 ?問題現象?&#xff1a;使用Router模塊的replaceUrl或startAbility等鴻蒙專屬API時&#xff0c;編譯跨平臺工程報錯cant support crossplatform application。 ?解決方案?&#xff1a; 改用ohos.router的跨平臺封裝API&a…

Matlab2018a---安裝教程

目錄 壹 | 引 言 貳 | 安裝環境 叁 | 安 裝 肆 | 結 語 壹 | 引 言 大家好&#xff0c;我是子正。 最近想學習一下DSP數字信號處理有關的知識&#xff0c;要用到Matlab進行數據處理&#xff0c;于是又重新把Matlab撿了回來; 記得上學那會兒用的還是Matlab2012a&#xff…

分布式流處理與消息傳遞——Kafka ISR(In-Sync Replicas)算法深度解析

Java Kafka ISR&#xff08;In-Sync Replicas&#xff09;算法深度解析 一、ISR核心原理 #mermaid-svg-OQtnaUGNQ9PMgbW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OQtnaUGNQ9PMgbW0 .error-icon{fill:#55222…

ARM GIC V3概述

中斷類型 locality- specific peripheral interrupt&#xff08;LPI&#xff09;&#xff1a;LPI是一個有針對性的外設中斷&#xff0c;通過affinity路由到特定的PE。 為非安全group1中斷邊沿觸發可以通過its進行路由沒有active狀態&#xff0c;所以不需要明確的停用操作LPI總…

藍橋杯國賽訓練 day1

目錄 k倍區間 舞獅 交換瓶子 k倍區間 取模后算組合數就行 import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class Main {static Scanner sc new Scanner(System.in);public static void main(String[] args) {solve();}public static vo…

安裝和配置 Nginx 和 Mysql —— 一步一步配置 Ubuntu Server 的 NodeJS 服務器詳細實錄6

前言 昨天更新了四篇博客&#xff0c;我們順利的 安裝了 ubuntu server 服務器&#xff0c;并且配置好了 ssh 免密登錄服務器&#xff0c;安裝好了 服務器常用軟件安裝, 配置好了 zsh 和 vim 以及 通過 NVM 安裝好Nodejs&#xff0c;還有PNPM包管理工具 。 作為服務器的運行…

鴻蒙版Taro 搭建開發環境

鴻蒙版Taro 搭建開發環境 一、配置鴻蒙環境 下載安裝 DevEco 建議使用最新版本的 IDE&#xff0c;當前為 5.0.5Release 版本。 二、創建鴻蒙項目 打開 DevEco&#xff0c;點擊右上角的 Create Project&#xff0c;在 Application 處選擇 Empty Ability&#xff0c;點擊 Ne…

Could not get unknown property ‘mUser‘ for Credentials [username: null]

最近遇到jekins打包報錯&#xff1a; Could not get unknown property mUser for Credentials [username: null] of type org.gradle.internal.credentials.DefaultPasswordCredentials_Decorated。 項目使用的是gradle&#xff0c;通過pipeline打docker包&#xff1b;因為ma…

Spring Boot + MyBatis-Plus 讀寫分離與多 Slave 負載均衡示例

Spring Boot + MyBatis-Plus 讀寫分離與多 Slave 負載均衡示例 一、項目結構 src/main/java/com/example/demo/ ├── config/ │ ├── DataSourceConfig.java # 數據源配置 │ ├── MyBatisPlusConfig.java # MyBatis-Plus配置 ├── constant/ │…

android binder(1)基本原理

一、IPC 進程間通信&#xff08;IPC&#xff0c;Inter-Process Communication&#xff09;機制&#xff0c;用于解決不同進程間的數據交互問題。 不同進程之間用戶地址空間的變量和函數是不能相互訪問的&#xff0c;但是不同進程的內核地址空間是相同和共享的&#xff0c;我們可…

高密爆炸警鐘長鳴:AI為化工安全戴上“智能護盾”

一、高密爆炸&#xff1a;一聲巨響&#xff0c;撕開化工安全“傷疤” 2025年5月27日&#xff0c;山東高密友道化學有限公司的車間爆炸聲&#xff0c;像一把利刃劃破了化工行業的平靜。劇烈的沖擊波將車間夷為平地&#xff0c;黑色蘑菇云騰空而起&#xff0c;刺鼻的化學氣味彌漫…

雙擎驅動:華為云數字人與DeepSeek大模型的智能交互升級方案

一、技術融合概述 華為云數字人 華為云數字人&#xff0c;全稱&#xff1a;數字內容生產線 MetaStudio。數字內容生產線&#xff0c;提供數字人視頻制作、視頻直播、智能交互、企業代言等多種服務能力&#xff0c;使能千行百業降本增效。另外&#xff0c;數字內容生產線&#…

Linux運維筆記:1010實驗室電腦資源規范使用指南

文章目錄 一. 檢查資源使用情況&#xff0c;避免沖突1. 檢查在線用戶2. 檢查 CPU 使用情況3. 檢查 GPU 使用情況4. 協作建議 二. 備份重要文件和數據三. 定期清理硬盤空間四. 退出 ThinLinc 時注銷&#xff0c;釋放內存五. 校外使用時配置 VPN注意事項 總結 實驗室的電腦配備了…

手機郵箱APP操作

收發電子郵件方式 郵箱可以在網絡段登錄&#xff0c;也可以在手機端登錄。 大學網絡服務 收發電子郵件有三種方式&#xff1a; 1、Web方式&#xff1a; 1&#xff09;登錄“網絡服務”&#xff08;https://its.pku.edu.cn&#xff09;&#xff0c;點頁面頂端“郵箱”。 2&…