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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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&…