• WebApi系列~按需序列化字段~Hot


    回到目录

    起初只是一个想法,一次讨论,一个设想,但相信一定可以实现,具体的事情是这样的,有个对外的API项目,它为一些终端设备提供数据,如手机,平板,PC,当然你也可以说它为很多平台提供数据win32,mac,ios,android,对于PC设备来说,接口返回的数据量当然没有那么敏感,但对于移动设备,对这点要求就高些,不需要的数据请不要为我返回,因为那么会发费我很多流量!

    是的,这是2010年到未来某个时期的热门话题,网络带宽是收费的,不要随便浪费!

    第一次想法失败了

    终端-〉请求数据包-〉服务端接口接改并处理-〉数据返回并过滤无用字段

    这个模型在我的大脑里呈现,但经过实践的证明,很遗憾,它是无法实现的,因为你不能为每个属性动态去添加一种叫做JsonIgnore的特性(不会被序列化),因为这种特性属于一种元信息,我们在程序运行时,只能获取它,设置它的值,而不能添加或者移除它(反射),当然,你可以从新动态创建一个类,一个类的方法和属性(Emit)

    第二次想法成功了

    数据层和业务层在服务端去干自己的事,返回自己完整的数据吧,我不去关心它,我关心的是在API返回数据时的动作(序列化),所以第二次想法出来了,将实体对象在进行JSON序列化时进行加工,将不需要的字段从JSON字符串中去掉,就OK了,注意本代码只是第一版,目前还不支持JSON的嵌套属性,这个递归我打算在第二版再实现它,呵呵,不想让它太复杂!

    下面是我的代码

            /// <summary>
            /// 功能:集合按需要序列化
            /// author:仓储大叔
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="list"></param>
            /// <param name="fun"></param>
            /// <returns></returns>
            public static string ToJson(this object type, params string[] param)
            {
                StringBuilder buffer = new StringBuilder();
                if (type.GetType().Name == "List`1")
                {
                    buffer.Insert(0, "[");
                    foreach (var t in (IEnumerable<object>)type)
                    {
                        GeneratorJsonStr(buffer, t, param);
                    }
                    buffer.Append("]");
                }
                else
                {
                    GeneratorJsonStr(buffer, type, param);
                }
                return buffer.ToString();
            }
            /// <summary>
            /// 为对象生成Json字符串
            /// </summary>
            /// <param name="buffer"></param>
            /// <param name="t"></param>
            /// <param name="param"></param>
            static void GeneratorJsonStr(StringBuilder buffer, object t, params string[] param)
            {
                var obj = new List<string>();
                foreach (var item in param)
                {
                    var p = t.GetType().GetProperty(item, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                    if (p != null)
                    {
                        if (p.PropertyType == typeof(string))
                            obj.Add(p.Name + ":"" + p.GetValue(t) + """);
                        else
                            obj.Add(p.Name + ":" + p.GetValue(t));
                    }
                }
                if (obj.Count > 0)
                    buffer.Append("{" + string.Join(",", obj) + "}");
            }

    感谢您的阅读!

    回到目录

  • 相关阅读:
    javaHTTP请求工具类-使用HttpURLConnection实现
    windows 无法启动redis 服务(位于本地计算机上)错误1053 服务没有及时响应启动或控制请求
    Redis 教程
    谢娜离开《快本》103天,暴露了芒果一姐的假相:有一种天真,叫错把平台当本事
    Api 在线文档目录:java8 中文、java11中文
    Linux关闭防火墙命令red hat/CentOs7
    Win10使用RedisDesktopManager工具连接虚拟机(CentOS 7)Redis
    如何win10 上访问虚拟机(linux)上redis方法
    汽车车牌JS正则表达式验证(含新能源车牌)
    vue 直接输入路由地址进入_vue地址栏直接输入路由无效问题
  • 原文地址:https://www.cnblogs.com/lori/p/4954808.html
Copyright © 2020-2023  润新知