ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【c#】JavaScriptSerializer 不序列化null值

2021-07-28 21:32:16  阅读:220  来源: 互联网

标签:null c# Entity item new var JavaScriptSerializer 序列化 public


首先引用dll :System.Web.Extensions。 再自定义转换器代码如下:
public class JavaScriptSerilizeConvert : JavaScriptConverter
    {
        //支持的需要转换的类型,是集合可以是多个
        public override IEnumerable<Type> SupportedTypes =>  new List<Type>(new Type[] { typeof(Entity) });

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            //这样写,不管什么类型的对象都能反序列化了
            var t = Activator.CreateInstance(type);

            var props = type.GetProperties();

            if (dictionary != null)
            {
                foreach (var item in dictionary)
                {
                    //这里有可能大小写不同,
                    //兼容大小写
                    var p = props.Where(a => a.Name.ToLower() == item.Key.ToLower()).ToList();
                    if(p.Count>1)
                     p = props.Where(a => a.Name== item.Key).ToList();

                    if (p.Count > 0)
                    {
                        int val = 0;

                        if (p[0].PropertyType == typeof(int))
                        {
                            if (int.TryParse(item.Value.ToString(), out val))
                            {

                                p[0].SetValue(t, val);
                            }
                        }// else if double 这里要判断double 其他也一样
                        else
                        {
                            p[0].SetValue(t, item.Value);
                        }

                        
                    }

                }
                return t;
            }
            return null;
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            //不同的类型实体可以做不同的处理
            if (obj is Entity)
            {
                Entity t = obj as Entity;

                var dic= new Dictionary<string, object>();
                var type = t.GetType();

                var props = type.GetProperties();

                foreach (var item in props)
                {
                    var val = item.GetValue(obj);

                    if (val != null)
                    {
                        dic.Add(item.Name, val);
                    }
                }

                return dic;
            }
            else
            {
                return new Dictionary<string, object>();
            }
        }
    }
控制台测试程序:
static void Main(string[] args)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            var entity = new Entity();

            entity.Id = 1;
            entity.Name = null;
            entity.Des = "123";
            可以注册多个自定义转换器
            serializer.RegisterConverters(new JavaScriptConverter[] { new JavaScriptSerilizeConvert() });
            var str = serializer.Serialize(entity);

            Console.WriteLine(str);

            //这里需要注意 一般在不用转换器的情况下 如果实体里属性Id的类型是int类型,
            //这里2出就不要加双引号,不然报错
            //我这里在自定义转换器上做了处理,所以能够把string类型的2转换成int型。
            var str2 = "{ \"Id\":\"2\",\"Name\":null,\"Des\":\"\"}";
            var en2 = serializer.Deserialize<Entity>(str2);
            Console.WriteLine(en2.Id);
            Console.ReadLine();
        }
实体Entity:
public   class Entity
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Des { get; set; }
    }

这是简单的实体,如果有实体嵌套,也没关系,如果是都不序列化null,public override IEnumerable<Type> SupportedTypes => new List<Type>(new Type[] { typeof(Entity),typeof(SubEntity) });这里加上就行

 

标签:null,c#,Entity,item,new,var,JavaScriptSerializer,序列化,public
来源: https://www.cnblogs.com/HelloQLQ/p/15072679.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有