回到目录

起初只是一个想法,一次讨论,一个设想,但相信一定可以实现,具体的事情是这样的,有个对外的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(, "[");
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 > )
buffer.Append("{" + string.Join(",", obj) + "}");
}

感谢您的阅读!

回到目录

WebApi系列~按需序列化字段~Hot的更多相关文章

  1. WebApi系列~目录

    回到占占推荐博客索引 写了这个系列的文章不少了,也应该为大家写个目录了,最近很刮了很多SOA的风,很多企业都将自己的系统进行分割,通常是按模块进行拆分,为这个模块提供统一的接口提供业务服务,这不紧可以 ...

  2. 【WebApi系列】详解WebApi如何传递参数

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  3. 【WebApi系列】浅谈HTTP

    [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi如何传递参数 [04]详解WebApi测试和PostMan [05]浅谈WebApi Core ...

  4. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  5. MS SQL巡检系列——检查外键字段是否缺少索引

    前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方 ...

  6. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

    1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...

  7. 学习ASP.NET Core Razor 编程系列十一——把新字段更新到数据库

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  8. 反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段

    反射序列化字段的时候,需要添加[Datamember]不然会,忽略这个字段

  9. WebApi系列知识总结

    WebApi系列知识 一.webApi项目搭建 1.新建WebApi项目 (1) (2) (3) (4) Areas – HelpPage – App_Start – HelpPageConfig.c ...

随机推荐

  1. HDU Game Theory

    5795 || 3032 把x个石子的堆分成非空两(i, j)或三堆(i, j, k)的操作->(sg[i] ^ sg[j])或(sg[i] ^ sg[j] ^ sg[k])是x的后继 #def ...

  2. javacript实现不被浏览器拦截打开新窗口

    情景: 1.用户发送数据到服务器 2.服务器根据用户的数据生成文档 3.服务器把所生成的文档的下载地址提供给用户 4.用户使用的浏览器自动根据下载地址下载文件 实现: 网上搜索查找了下实现方式,就我查 ...

  3. (bzoj2330)糖果

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MB Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋 ...

  4. PerconaXtraBackup 压缩备份集

    压缩备份集 stream模式支持且只支持:tar 和 xbstream 两种格式,后者是xtrabackup提供的专有格式,解包时需要同名的专用命令处理 innobackupex --defaults ...

  5. Python 3 —— 控制语句

    控制语句 1.if if <s>: ... elif <s>: ... else: ... 2 for for e in list .. if <s> break; ...

  6. Celery Running Environment

    After running celery in my machine, I got this: Running a worker with superuser privileges when the ...

  7. .NET 4.5+项目迁移.NET Core的问题记录

    .NET 4.5+项目迁移.NET Core的问题记录 这几天试着把目前的开发框架迁移到新的.net core平台,中间遇到的问题在这里简单记录一下. 迁移过程遇到的最大的问题IOC容器.我目前使用的 ...

  8. Python基于pandas的数据处理(一)

    import pandas as pd, numpy as np dates = pd.date_range(', periods=6) df = pd.DataFrame(np.random.ran ...

  9. PYTHON学习之路_PYTHON基础(6)

    学习内容: Python模块介绍 1.time &datetime模块 2.random 3.shutil 4.shelve 5.xml处理 6.configparser 7.hashlib ...

  10. java word 转 pdf

    这里使用jacob将word转pdf,使用的是jacob.jar import java.io.File;import com.jacob.activeX.ActiveXComponent;impor ...