博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
运用Composite模式构造JSON
阅读量:7071 次
发布时间:2019-06-28

本文共 4149 字,大约阅读时间需要 13 分钟。

  Json是如今流行的Ajax或Service数据交换格式,.NET使用DataContractJsonSerializer(System.Runtime.Serialization.Json命名空间下),可以很方便地在json字符串和实体对象间转换。

  在服务站点上,更无须写代码序列化Json。服务默认以xml形式返回结果,但如果Web请求头信息中的Accept属性为application/json,客户端得到的就是以json格式序列化了结果。

  客户端用jquery实现很简单,只要调用时,设置dataType:’json’就可以了。

  客户端也可以发送json到让服务处理,只要把请求头的ContentType设为text/json(jquery的ajax函数也有这个属性),服务会自动将请求内容反序列化为实体。

  然而很多情况下,我们输出的json不是标准的实体集合,可能只输出其中个别属性,或者掺点别的东西,比如分页查询,我们要告诉客户返回的结果集是第几页,一共有多少页,这样的json还得我们自己通过代码输出。这就比较烦了,业务复杂点没办法,但写那些单引双引,花括号方括号,经常还得转义,可一点不好玩。比如一个最简单的实体:

var sb = new StringBuilder("[");foreach (var user in lstUser){    sb.AppendFormat("{
{'name':'{0}','email':'{1}'}},",user.Name,user.Email);}sb.Remove(sb.Length - 1, 1);sb.Append("]");

 

  能一遍写对这段代码的人,绝非等闲之辈。偶打草稿时还写错了。相形之下,json的老大哥xml就给力多了,因为里面所有操作都可以通过对象,比如XAttribute、XText、XComment等。

class Program{    static void Main()    {        var lstUser = new List
{ new User { Name = "潘金莲", Email="pjl@sh.com"}, new User { Name = "武松", Email="ws@sh.com"}, new User { Name = "西门庆", Email="xmq@sh.com"} }; var xe = new XElement("Users", from u in lstUser select new XElement("User", new XAttribute("name", u.Name), new XAttribute("email", u.Email))); Console.WriteLine(xe); Console.ReadLine(); } class User { public string Name { get; set; } public string Email { get; set; } }}

 

  优雅的5行代码,把潘金莲和她最重要的两个男人潇洒地绑在一起。写Json也能如此优雅吗,完全可以,其实我们早就有了,重量级拳手,我感觉,玩我们日常的应用如同高射炮打麻雀,还不如做个弹弓来的实惠。

  仿照XNode,定义了几个Json对象类型:

/// /// 表示json数组/// class JArray : JElement{    public JArray(params object[] array)    {        this.Elements = array.Select(o =>        {            var element = o as JElement;            if (element == null) return new JElement(o);            else return element;        }).ToList();    }    public List
Elements { get; set; } public override string ToString() { return "[" + String.Join(",", this.Elements) + "]"; }}///
/// 表示json实体对象/// class JEntity : JElement{ public JEntity(params JProperty[] properties) { this.Value = properties.ToList(); } public List
Properties { get { return this.Value as List
; } } public override string ToString() { return "{" + String.Join(",", this.Properties) + "}"; }}///
/// 表示一个json实体的属性键值对/// class JProperty { public JProperty(string name, object value) { this.Name = name; var element = value as JElement; if (element == null) element = new JElement(value); this.Value = element; } public string Name { get; set; } public JElement Value { get; set; } public override string ToString() { return "'" + Name + "':'" + Value + "'"; }}///
/// 表示基本的json元素/// class JElement{ public JElement() { } public JElement(object value) { var array = value as System.Collections.IEnumerable; if (array != null && !(value is string)) { this.Value = new JArray(array.Cast
().ToArray()); } else this.Value = value; } public object Value { get; set; } public override string ToString() { var type = Value.GetType(); if (type.IsPrimitive) { if (type == typeof(int) || type == typeof(double)) return Value.ToString(); } return "'" + Value + "'"; }}

 

  然后,我们就可以这么写json了,看,与输出xml的写法很相似吧:

var json = new JArray(    (from u in lstUser    select new JEntity(        new JProperty("name", u.Name),        new JProperty("email", u.Email))).ToArray());Console.WriteLine(json);

 

  话说json本来就是轻量级的数据交换格式,轻量级格式也应该用轻量方法处理,并且还要能重用,最重要的是一目了然,大家可以考虑下这种方式。对JArray等几个构造函数,还待进一步改进。

  经过最近研究,发现这种优雅的方式json构造方式,莫非是暗合了江湖至高无上,OOP兵法23条中的Composite模式(第九章)?无意中得窥至尊宝典之道,哇呀妙哉!

  最近还发现了,json还有个小弟,唤作的东东,火星了,原来就是BingMap API的脚本加载方式,经常使用还朦朣不觉。

  现在轮到自己写服务器端,不想破坏WCF自动转换的优美,想用输出替换的方式,但设置Resonse.Filter()真麻烦,又只能写不能读。只好响应全局事件,在正文开始前先写入客户端回调的函数名和一个括号,在正文输出结束后添上另一个括号。虽然早就知道,可每次写起来,偶的心还是隐隐作疼,纠结一番。

转载于:https://www.cnblogs.com/XmNotes/archive/2011/08/19/2146355.html

你可能感兴趣的文章
wcf out参数 异步调用问题
查看>>
ASP.NET MVC集成EntLib实现“自动化”异常处理[实例篇]
查看>>
C# Attribute
查看>>
用Hadoop1.0.3实现KMeans算法
查看>>
[Z]Computer Modern的故事
查看>>
Groovy闭包深入学习 - [203] 一直都有新高度 - ITeye技术网站
查看>>
[C#]DataTable常用操作总结【转】
查看>>
JdbcTemplate查询数据 三种callback之间的区别
查看>>
GBK
查看>>
Linux的nm查看动态和静态库中的符号
查看>>
hrbeu 哈工程 Who Is In Front of Me
查看>>
Linux命令行下常用svn命令
查看>>
一个form中对应多个动作
查看>>
注意!ASP.NET MVC 3 的一个 OutputCache 问题
查看>>
androidalertDialog无法显示按钮的bug
查看>>
跟我一起学习ASP.NET 4.5 MVC4.0(四)
查看>>
时钟周期/指令周期/机器周期/总线周期
查看>>
Python 开发者应该知道的 7 个开发库
查看>>
mysql索引之九:重复索引和冗余索引,索引和锁
查看>>
魔方阵
查看>>