2014年2月20日星期四

C# 解析 json

C# 解析 json
  JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。 JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。

JSON与XML的比较
可读性
  JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解。
文件大小与传输
  XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于Javascript,所以天生的主战场是Javascript与网络,在这里,JSON有着XML无法赶超的优势。

JSON语法
1. JSON 语法是 JavaScript 对象表示法语法的子集。

    数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。
    数据由逗号分隔:
    花括号保存对象:对象可以包含各种数据,包括数组。
    方括号保存数组:数字可以包含对象。

例如:
 

复制代码代码示例:
{
    "employees": [
        {
            "firstName": "Bill",
            "lastName": "Gates"
        },
        {
            "firstName": "George",
            "lastName": "Bush"
        }
    ]
}

2. 如果JSON中含有转义字符,则需要转义。例如文件路径中需要使用"\\"而不是"\"。例如:{ "file":"C:\\a.txt"}。
 
.NET操作JSON
  JSON文件读入到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。操作JSON通常有以下几种方式:
1. 原始方式:自己按照JSON的语法格式,写代码直接操作JSON字符串。如非必要,应该很少人会走这条路,从头再来的。

2. 通用方式

这种方式是使用开源的类库Newtonsoft.Json(下载地址http://json.codeplex.com/)。下载后加入工程就能用。通常可以使用JObject, JsonReader, JsonWriter处理。
(1)使用JsonReader读Json字符串:
 

复制代码代码示例:

string jsonText = @"{""input"" : ""value"", ""output"" : ""result""}";
JsonReader reader = new JsonTextReader(new StringReader(jsonText));

while (reader.Read())
{
    Console.WriteLine(reader.TokenType + "\t\t" + reader.ValueType + "\t\t" + reader.Value);
}

(2)使用JsonWriter写字符串:
 

复制代码代码示例:

StringWriter sw = new StringWriter();
JsonWriter writer = new JsonTextWriter(sw);

writer.WriteStartObject();
writer.WritePropertyName("input");
writer.WriteValue("value");
writer.WritePropertyName("output");
writer.WriteValue("result");
writer.WriteEndObject();
writer.Flush();

string jsonText = sw.GetStringBuilder().ToString();
Console.WriteLine(jsonText);

 (3)使用JObject读写字符串:
 

复制代码代码示例:
JObject jo = JObject.Parse(jsonText);
string[] values = jo.Properties().Select(item => item.Value.ToString()).ToArray();

 (4)使用JsonSerializer读写对象(基于JsonWriter与JsonReader):

数组型数据
 

复制代码代码示例:
string jsonArrayText1 = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]";
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1);
string ja1a = ja[1]["a"].ToString();
//或者
JObject o = (JObject)ja[1];
string oa = o["a"].ToString();

嵌套格式
 

复制代码代码示例:
string jsonText = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}";
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["beijing"]["zone"].ToString();
string zone_en = jo["beijing"]["zone_en"].ToString();

自定义类Project
 

复制代码代码示例:

Project p = new Project() { Input = "stone", Output = "gold" };
JsonSerializer serializer = new JsonSerializer();
StringWriter sw = new StringWriter();
serializer.Serialize(new JsonTextWriter(sw), p);
Console.WriteLine(sw.GetStringBuilder().ToString());

StringReader sr = new StringReader(@"{""Input"":""stone"", ""Output"":""gold""}");
Project p1 = (Project)serializer.Deserialize(new JsonTextReader(sr), typeof(Project));
Console.WriteLine(p1.Input + "=>" + p1.Output);

上面的代码都是基于下面这个Project类定义:
 

复制代码代码示例:
class Project
{
    public string Input { get; set; }
    public string Output { get; set; }
}

  此外,如果上面的JsonTextReader等类编译不过的话,说明是我们自己修改过的类,换成你们自己的相关类就可以了,不影响使用。

3. 内置方式:使用.NET Framework 3.5/4.0中提供的System.Web.Script.Serialization命名空间下的JavaScriptSerializer类进行对象的序列化与反序列化,很直接。
 

复制代码代码示例:

 Project p = new Project() { Input = "stone", Output = "gold" };
 JavaScriptSerializer serializer = new JavaScriptSerializer();
 var json = serializer.Serialize(p);
 Console.WriteLine(json);

 var p1 = serializer.Deserialize<Project>(json);
 Console.WriteLine(p1.Input + "=>" + p1.Output);
 Console.WriteLine(ReferenceEquals(p,p1));

  注意:如果使用的是VS2010,则要求当前的工程的Target Framework要改成.Net Framework 4,不能使用Client Profile。当然这个System.Web.Extensions.dll主要是Web使用的,直接在Console工程中用感觉有点浪费资源。
  此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式。

4. 契约方式:使用System.Runtime.Serialization.dll提供的DataContractJsonSerializer或者 JsonReaderWriterFactory实现。
 

复制代码代码示例:

Project p = new Project() { Input = "stone", Output = "gold" };
DataContractJsonSerializer serializer = new DataContractJsonSerializer(p.GetType());
string jsonText;

using (MemoryStream stream = new MemoryStream())
{
    serializer.WriteObject(stream, p);
    jsonText = Encoding.UTF8.GetString(stream.ToArray());
    Console.WriteLine(jsonText);
}

using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonText)))
{
    DataContractJsonSerializer serializer1 = new DataContractJsonSerializer(typeof(Project));
    Project p1 = (Project)serializer1.ReadObject(ms);
    Console.WriteLine(p1.Input + "=>" + p1.Output);
}

注意,这里的Project类和成员要加相关的Attribute:
 

复制代码代码示例:
[DataContract]
class Project
{
    [DataMember]
    public string Input { get; set; }
    [DataMember]
    public string Output { get; set; }
}

2014年值得推荐的10个企业服务应用

不论你是企业中的人力资源经理、还是网络管理员;不论你是市场经理、或者是销售人员;不论你是产品经理、还是技术开发人员;在万马奔腾,大家力争一马当先的甲午马年,笔者总结了10个最值得推荐使用的企业服务应用软件或平台,可以让你及你的公司更加快马加鞭、马到成功。(排名不分先后)

一:问卷网 www.wenjuan.com

去年看到过很多的媒体推荐问卷网,不禁感慨,问卷网的公关做得好呀。但当笔者自己仔细去使用问卷网并询问朋友企业时,才发现,问卷网在网络问卷调查、表单数据收集上确实值得推荐。

在问卷网上,使用者最多的估计应该是市场经理或者产品经理,他们用问卷网可以轻松快捷地设计用户反馈问卷,听取市场的声音。而当朋友的公司说用问卷网来进行优秀员工评选、办公室地点投票时,才发现,问卷网的使用场景绝不只是市场调查这一个。对外,消费者反馈、合作伙伴满意度调查等等;对内员工满意度调查、人力资源评测等等都可以在问卷网的问卷库中找到模板并轻松实现。

对于问卷网,笔者的判断是,或许你不一定用得到问卷网,但是你有同事一定会用得上。

二:金山云www.ksyun.com

国内云服务主要指主机服务和云存储服务。在主机服务领域,阿里云虽然曾一马当先,但多次因为不稳定(对外或是说技术维护、或是升级)及云数据库方面的限制,被众多的公司或网站站长吐槽甚至抛弃。

金山云由原来微软技术大拿张宏江博士亲自挂帅CEO,重视程度之高、投入程度之大前所未有。而根据数名使用金山云主机服务的企业高管反馈,金山云主机在灵活性、稳定性方面都非常不错,曾经阿里云的使用者更是反馈,金山服务人员的服务热情、响应速度以及专业支持方面,更甚一筹。

金山云服务还集合了企业网盘和个人网盘服务。相比单纯的百度网盘、360云盘等更加安全便捷,有利于公司文件的同步协同。

金山,曾经WPS的辉煌,会在云基础服务上延续吗?如果企业的IT人员使用过云服务,会给出肯定答案。

三:猎聘网 www.liepin.com

每每新春开年,会到来一个招聘的高峰。如果你是企业的人力资源经理,这个时候应该忙得不可开交。除了传统的51job、智联招聘,笔者极力推荐猎聘网。

对比传统的招聘网站,猎聘网在中高端人才招募方面独树一帜。根据猎聘网自己的介绍,它拥有目前国内最大的猎头核心信息数据平台,也因此成为职场精英寻求职场晋升、规划职业发展的第一选择。独特的高端人才互动社区,优质的人才猎聘服务,也使其成为了世界500强企业以及中国猎头公司重要的人才搜寻渠道。

笔者询问过自己公司的人事招聘经理,并且经介绍,采访过数十位人事经理,他们都较认同通过猎聘网招募中高级人才的策略思路。

看看各写字楼电梯口分众传媒上的猎聘的广告,就会发现,猎聘在中高级人才库建设上确实不惜血本。这也是成就他们如此定位的注脚吧。

四:明道 www.mingdao.com

明道,明工作之道;在社会化、移动化、时间碎片化的今天,团队协作是关键。在这个网络普及的时代里,如果还不知道企业社交网络平台那就太Out了。

明道作为企业内部协作平台,本质是要解决企业中人与人沟通的问题,使企业形成一种开放、自由沟通、协作的风气。明道通过社会化沟通范式加强内部沟通中的协调性,打破内部沟通边界。内部员工可以管理项目和任务,还可分享渐进积累的企业知识资产。其提供的iPhone,安卓,iPad和桌面客户端,都可以打破沟通时空间和时间的限制,让全员随时接入互动。

开放沟通、知识管理、任务协作、移动办公;看看这些明道的功能特性,值得推荐。

五:销售易www.xiaoshouyi.com

CRM是网络时代永恒的主题,当传统的CRM厂商面对社会化移动化浪潮不知所措时,销售易已经开始在用户中引起良好的反响。

销售易,利用先进的移动互联(Mobile)、社交网络(Social )以及云计算(Cloud)技术彻底重构了CRM。销售易以"销售人员"为中心,辅以流程、协作、知识、移动工具,首次让CRM成为销售人员移动办公和打单利器,助力企业全面提升销售团队执行力。

随时随地掌握销售人员的工作进度、快速捕捉客户线索,销售易作为一款轻型的CRM工具,推荐。

六:雇得易 www.hirede.com

传统的招聘方式要用,但社会化的招聘方式更应该用。雇得易是一款基于社会化思路运营的招聘管理工具。

在雇得易的产品组合中,既有定位于校园的校园招聘iCampus、也有基于猎头的猎聘管理iHunter、还有鼓励员工内部推荐人才的爱伯乐iBole。所有雇得易产品立足于社会化、移动化的思路开发,是企业人力资源管理的利器。

而雇得易平台化的产品定位,引入了如人力资源满意度调查、人才测评的第三方应用,丰富了人力资源服务内容。

七:安全宝www.anquanbao.com

笔者本人所在的公司服务器就受到过黑客攻击,那几天时间,IT人员是焦头烂额。而企业服务器安全市场,在为数不多的几家中,安全宝是发展突出的一家。

安全宝为企业网络提供一站式的安全解决方案。他能使企业的网络在"零部署"、"零维护"的情况下,防止诸如XSS、SQL注入、木马、零日攻击、僵尸网络等各种网络安全问题。同时,安全宝综合采用跨运营商智能调度、页面优化、页面缓存等技术,进一步提升访问速度,降低故障率,从而整体提升网站的用户体验。

安全宝为客户提供了免费版、专业版、性能加强版及高级版套餐和专项服务,以及为企业网站系统定制的行业专属解决方案,让企业按需选择保护网站安全。

为企业提供便捷易用的云安全,安全宝获得了数万家企业的青睐。

八:友盟 www.umeng.com

如果你的公司已经有了用户量不错的APP,或许你们已经用上了友盟统计。

从2013年起,友盟已经不只是统计APP的工具,相继推出了社会化组件、消息推送、CDN云加速等产品和服务。

根据友盟人员介绍,国内主流开发者大多是友盟的用户,已有十余万计的移动应用从友盟服务中获益。

一个类似于CNZZ统计网站流量(友盟服务与移动APP)的平台,推荐一下。

九:会唐网 www.eventown.com.cn

是不是觉得刚过完年,搞完年会,就要订会议场地有点早。其实,不早,马上季度会议、半年会议、各种客户会议要准备了。如果你负责公司的市场或者客户关系,建议你看看会唐网。

会唐网是中文会议场地查询、预定及整合平台,建立了全球呼叫中心,专业为客户提供活动场地查询、预订及整合营销的一站式服务,致力于成就全球"最专业" 、"最系统"的事件营销管理专家。看看这个介绍觉得霸气,但如果你发现身边的公司十之二三通过它预订会议场地,你就会恍然大悟,原来预订场地这么简单快捷。

一个从名字看不出做什么的网站,但是确实能帮助我们便捷预订会议场地。推荐。

十:微信公众号 mp.weixin.qq.com

这是一个最不需要分析的推荐了,如果说你的公司建立了运营稳定的微博账号,而还没有建立微信公众号,那赶快吧。微博招新客,微信留老客。要知道招募一个新客户的成本是留住老客户的n多倍(n是几,自己度娘)。

是时候重视通过微信公众号来服务老客的时候了。

以上推荐,供参考,如果你的公司使用过更好的企业服务平台,欢迎推荐出来。

(本文并仅代表作者本人观点)