• JSON 序列化与反序列化, 与XML相互转换.


    方式一: 使用于 JavaScriptSerializer类
    适用于普通场景, Excel导入导出, 前台传输查询参数直接处理等.

           JavaScriptSerializer serializer = new 
           JavaScriptSerializer();
                serializer.MaxJsonLength = int.MaxValue;
                var qp = serializer.Deserialize<QueryP>(queryP);
            private class QueryP
            {
                public string OrgID { get; set; }
                public string KeyWords { get; set; }
            }
    
    
    
        JavaScriptSerializer serializer = new JavaScriptSerializer();
        var gridHeaders = serializer.Deserialize<List<grid>>(GridHeaders);
    
         /// <summary>
        /// grid表头
        /// </summary>
        [Serializable]
        public class grid
        {
            public string Text { get; set; }
            public string DataIndex { get; set; }
            public string Width { get; set; }
            public List<grid> Cols { get; set; }
            public bool Hiden { get; set; }
            public string xtype { get; set; }
            public string DataType { get; set; }//列类型
        }


    方式二: (不推荐使用DataContractJsonSerializer) 功能较多, 仅放一个例子, 不深入研究, 因为开源第三种方式不仅功能多, 性能还强. 

    //Person实体中的契约 [DataMember],[DataContract],是使用DataContractJsonSerializer序列化和反序列化必须要加的
    
    //使用DataContractJsonSerializer方式需要引入的命名空间,在System.Runtime.Serialization.dll.中
    
     using System.Runtime.Serialization.Json;    
    
    static void Main(string[] args)
        {
            //序列化操作
            Person p1 = new Person()
            {
                name = "fxhl",
                age = 23
            };
            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person));
            MemoryStream msObj = new MemoryStream();
            //将序列化之后的Json格式数据写入流中
            js.WriteObject(msObj, p1);
            //从0这个位置开始读取流中的数据
            msObj.Position = 0;     
            StreamReader sr = new StreamReader(msObj, Encoding.UTF8);
            string json = sr.ReadToEnd();
            Console.WriteLine(json);
            sr.Close();
            msObj.Close();
            //反序列化操作
            using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
                DataContractJsonSerializer deseralizer = new DataContractJsonSerializer(typeof(Person));
                Person model = (Person)deseralizer.ReadObject(ms);// //反序列化ReadObject
                Console.WriteLine(model.name);
            }
            Console.ReadKey();
        }
    }
    [DataContract]     
    public class Person
    {
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public int age { get; set; }
    }

    方式三: 引入 Newtonsoft.Json 使用. 

    拓展方法使用, 可以直接使用.  

    public static T DeserializeModel<T>(this T model, string json)
            {
                try
                {
                    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(json);
                }
                catch (Exception)
                {
                    return model;
                }
            }
    
            public static T DeserializeModel<T>(this T model, DataTable dt)
            {
                try
                {
                    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(Newtonsoft.Json.JsonConvert.SerializeObject(dt));
                }
                catch (Exception)
                {
                    return model;
                }
            }
    
    
            public static T DeserializeJSON<T>(this string json) where T : new()
            {
                try
                {
                    return Newtonsoft.Json.JsonConvert.DeserializeObject<T>((json));
                }
                catch (Exception)
                {
                    return new T();
                }
            }
    
    
            public static string SerializeModel(this object model)
            {
                return Newtonsoft.Json.JsonConvert.SerializeObject(model);
            }
    
            public static List<T> NMList<T>(this T model)// where T:new()
            {
                var L = new List<T>();
                return L;
            }
    
            public static Hashtable NMToHashTable<T>(this T model)
            {
                var ht = new Hashtable();
                foreach (var f in model.GetType().GetProperties())
                {
                    ht[f.Name] = f.GetValue(model, new object[] { });
                }
                return ht;
            }
    

    支持属性转译 和忽略字段.
    JsonIgnore 注解 和 PropertyName 注解等.

        public class AuditModel
        {
            [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)]
            public string SuccessMsg { get; set; }
    
            [JsonIgnore]
            public HttpRequestBase context { get; set; }



    最后, 利用Json.NET 完成Json到Xml 的转换:(完成的xml传输到数据库. 数据库根据/root 取相应执行逻辑)

            string JsonTOXml(string json, string modelName)
            {
                string _json = @"{
                                  ""?xml"": {
                                    ""@version"": ""1.0"",
                                    ""@standalone"": ""no""
                                  },
                                  ""root"": {
                                    ""modelName"": " + json + @"
                                  }
                                }";
                _json = _json.Replace("modelName", modelName);
                return Newtonsoft.Json.JsonConvert.DeserializeXmlNode(_json).OuterXml;
            }


    其他优秀博客可参考:
    https://www.cnblogs.com/fengxuehuanlin/p/5700282.html 
    http://www.cnblogs.com/yunfeifei/p/4086014.html
    https://blog.csdn.net/WuLex/article/details/83026080
    http://www.cnblogs.com/wuhuacong/p/3698122.html

     

  • 相关阅读:
    python 发送邮件 email
    python 日志 logging
    python 判断当前环境是什么系统 platform 模块
    pandas to_excel 添加颜色
    Pandas excel 双标题 多级索引 层次化索引 MultiIndex
    windows10 安装 pyltp python3.6
    Python的内存管理
    pandas 中 DataFramt 改变 列的顺序
    元组
    基本语法
  • 原文地址:https://www.cnblogs.com/hijushen/p/10563281.html
Copyright © 2020-2023  润新知