zoukankan      html  css  js  c++  java
  • System.Text.Json DataTable序列化

    中文和双引号会正常处理

    DataTable实现了序列化, 反序列化,目前没有用到,所以没有实现

    废话不说,直接拿去用吧

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Text.Json;
    using System.Text.Unicode;
    using System.Threading.Tasks;
    
    /*
        // 不序列化这个属性
        [JsonIgnore]
        // 包含字段
        [JsonInclude]
        // 自定义属性名
        [JsonPropertyName("score")]
     */
    namespace System
    {
        /// <summary>
        /// 
        /// </summary>
        public static class JsonTextHelper
        {
            /// <summary></summary>
            public static JsonSerializerOptions SerializerOptions { get; set; } = new JsonSerializerOptions();
    
            static JsonTextHelper()
            {
                // 添加自定义解析器
                // SerializerOptions.Converters.Add(new MyDateTimeConverter());
                // SerializerOptions.Converters.Add(new MyDateTimeNullConverter());
    
                // 忽略大小写
                SerializerOptions.PropertyNameCaseInsensitive = true;
    
                // 处理中文转义问题
                SerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All);
                /*
                    System.Text.Json 默认使用 Unicode 来进行安全的序列化,
                    因此将字串内的特殊符号编码成 Unicode,但这样可能有2个问题,
                    1.会造成 JSON 字串变大,
                    2." 字符,會变六個字符 u0022
                 */
                // 转义不安全字符 
                SerializerOptions.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
    #if DEBUG
                // 缩进
                SerializerOptions.WriteIndented = true;
    #endif
    
            }
    
            /// <summary>
            /// 序列化对象(可以是实体或实体集合)
            /// </summary>
            /// <param name="o">源字符串</param>
            /// <returns></returns>
            public static string SerializeObject(object o)
            {
                if (o is DataTable dt)
                {
                    return serializeDataTable(dt);
                }
    
                string jsonStr = JsonSerializer.Serialize(o, SerializerOptions);
                return jsonStr;
            }
    
            #region 反序列化
            /// <summary>
            /// 反序列化
            /// </summary>
            /// <typeparam name="T">目标类型</typeparam>
            /// <param name="jsonStr">源字符串</param>
            /// <returns></returns>
            public static T DeserializeObject<T>(string jsonStr)
            {
                if (String.IsNullOrEmpty(jsonStr)) return default;
    
                try
                {
                    return JsonSerializer.Deserialize<T>(jsonStr, SerializerOptions);
                }
                catch (Exception ex)
                {
                    var s = jsonStr.Length > 300 ? 300 : jsonStr.Length;
                    throw new Exception($"{jsonStr.Substring(0, s)} 反序列化异常!", ex);
                }
            }
    
            /// <summary>
            /// 反序列化jsonStr为实体集合
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="jsonStr"></param>
            /// <returns></returns>
            public static IList<T> DeserializeList<T>(string jsonStr) where T : new()
            {
                if (String.IsNullOrEmpty(jsonStr)) return new List<T>();
    
                try
                {
                    return JsonSerializer.Deserialize<IList<T>>(jsonStr, SerializerOptions);
                }
                catch (Exception ex)
                {
                    var s = jsonStr.Length > 300 ? 300 : jsonStr.Length;
                    throw new Exception($"{jsonStr.Substring(0, s)} 反序列化异常!", ex);
                }
            }
    
            /// <summary>
            /// 传入Json数组字符串,解析为DataTable
            /// </summary>
            /// <param name="jsonStr"></param>
            /// <returns></returns>
            public static DataTable DeserializeDataTable(string jsonStr)
            {
                if (String.IsNullOrEmpty(jsonStr)) return new DataTable();
    
                try
                {
                    throw new Exception("暂时不支持!");
    
                    ////反序列化为实体
                    //JArray ja = JArray.Parse(jsonStr);
                    //return JsonConvert.DeserializeObject<DataTable>(ja.ToString());
                }
                catch (Exception ex)
                {
                    var s = jsonStr.Length > 300 ? 300 : jsonStr.Length;
                    throw new Exception($"{jsonStr.Substring(0, s)} 反序列化异常!", ex);
                }
            }
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="jsonStr"></param>
            /// <returns></returns>
            public static IDictionary<String, Object> DeserializeDictionary(string jsonStr)
            {
                return JsonSerializer.Deserialize<IDictionary<string, object>>(jsonStr);
            }
            #endregion
    
            #region 辅助
            private static String serializeDataTable(DataTable dt)
            {
                var cols = new List<String>();
                foreach (DataColumn col in dt.Columns)
                {
                    cols.Add(col.ColumnName);
                }
    
                var sb = new StringBuilder();
                sb.Append("[");
    
                var count = dt.Rows.Count;
                for (var i = 0; i < count; i++)
                {
                    var row = dt.Rows[i];
    
                    var dic = new Dictionary<String, Object>();
                    foreach (var col in cols)
                    {
                        dic.Add(col, row[col]);
                    }
    
                    var dicJson = JsonTextHelper.SerializeObject(dic);
                    sb.Append(dicJson);
    
                    if (i + 1 != count)
                    {
                        sb.Append(",");
                    }
                }
    
                sb.Append("]");
    
                return sb.ToString();
            }
            #endregion
    
        }
    }
    

      

  • 相关阅读:
    .net core 基于IIS发布
    所有开源播放器
    JWT的相关讲解
    .NET Core2.0 使用EF做数据操作
    任意的组合,数组或数组,数组或list,list或list不用循环得出匹配的总数和需要的字段列
    linq to sql学习
    winform文本框怎么实现html的placeholder效果
    [数据结构]-单链表实现栈
    [数据结构]-数组实现栈
    [数据结构]-单链表
  • 原文地址:https://www.cnblogs.com/huawublog/p/14694909.html
Copyright © 2011-2022 走看看