JSON:C#与JS中的序列化与反序列化
来源:互联网 发布:python web开发框架 编辑:程序博客网 时间:2024/06/14 04:26
在Web项目中,序列化和反序列化是经常涉及到的话题,而很多人对JSON的理解也存在偏差,本文将从C#和JS的序列化和反序列化以及JSON的意义三个方面来讲述。
什么是序列化?序列化就是某一时刻“活动”对象的快照,将对象一瞬间的状态记录下来。序列化不外乎两个目的,传输和持久化。比如我想将内存中的一个对象保存到文本文件中,就通过某些手段获取对象的当前状态其实也就是对象成员的值,以文本或者二进制保存到内存或者外存上。反序列化的工作正好相反,是将已经“扁平化"的对象的值重新填充到新实例中。
在Web应用中,应用的最普遍的是将对象序列化成一段描述自身的文本。
1、C#中的序列化和反序列化
简单的序列化如下,我使用JSON.NET库来进行操作。
<span style="font-size:12px;"> class Program { static void Main(string[] args) { Person person = new Person() { Name = "echo", Age = 30 }; Console.WriteLine(JsonConvert.SerializeObject(person)); //output: { "Name" : "echo", "Age":30 } Console.ReadLine(); } } class Person { public string Name; public int Age; }</span>
输出结果: { "Name" : "echo", "Age":30 }
反序列化代码如下
<span style="font-size:12px;"><span style="font-size:14px;"> class Program { static void Main(string[] args) { string obj="{\"Name\" : \"echo\", \"Age\":30 }"; Person person = JsonConvert.DeserializeObject<Person>(obj); Console.WriteLine("Name:"+person.Name+",Age:"+person.Age); Console.ReadLine(); } } class Person { public string Name; public int Age; }</span></span>
2、JavaScript中的序列化和反序列化
JavaScript可能是这个世界上被误解最深的一种语言,就算在高级语言里来说,它也是相当复杂的一门语言。基于原型的继承、闭包等特性一点都不比C#简单。因为不屑于学习而导致的误解和滥用在前端开发领域是在是太多了,Jquery要为此负上很大一部分责任,Jquery不是JavaScript。
C#或者JAVA中的序列化尚可理解,js中其实也有序列化和反序列化,许多人天天自觉或者不自觉的在用,但是可能并不明晰这个概念。我依旧用一个小例子来说明,不好意思此处用到了json2.js和jquery。这真是一个插件的世界....
序列化对象:
var o_Person = {}; o_Person.name = 'echo'; o_Person.age = 30; alert(JSON.stringify(o_Person));输出结果: { "Name" : "echo", "Age":30 }
反序列化对象:
此处就是很多人一直纠结的所谓JSON的问题,其实JS中并不存在JSON,JS里面只有对象、数组、字符串、数字等基本类型。请看下面这段代码:
var a_test = [], o_name = {}, o_age = {}; o_name.name = 'echo'; o_age.age = 30; a_test.push(o_name); a_test.push(o_age); alert(JSON.stringify(a_test));
输出:[ {"name":"echo"},{"age":30}]
此时,你难道能说a_test是一个所谓的JSON对象吗?no no,它就是一个数组而已,数组里装了两个对象,仅此而已。我们再来看下面一段代码:
var s_array = '[{"name":"echo"},{"age":30}]'; var o_name = s_array[0];//第一个字符 var o_age = s_array[1];//第二个字符 alert(typeof (s_array)); alert(typeof (o_name)); alert(typeof (o_age));会发现就算我们把一个JSON文本赋给一个变量,这个变量依旧是个文本,而不会自动的变成一个JS数组或对象。这就是引起迷惑的地方。有的人说我发送参数的时候写JSON文本和对象都可以,确实可以,因为很多工作jquery悄悄的替你完成了。要让
'[{"name":"echo"},{"age":30}]'变成一个数组,其实就是JS中的反序列化。 代码如下:
var s_array = '[{"name":"echo"},{"age":30}]'; var a_array = $.parseJSON(s_array); var o_name = a_array[0];//第一个对象 var o_age = a_array[1];//第二个对象 alert(typeof (a_array)); alert(typeof (o_name)); alert(typeof (o_age)); alert(o_name.name); alert(o_age.age);此处使用的是jquery的方法,你用别的插件或者自己写方法都是可以的。此处JSON文本被成功的反序列化成了对象,所有的属性都读了出来。
上述就是JS中的序列化和反序列化。
3、JSON的意义
不知道大家发现没有,在C#和JS中相同的对象被序列化后产生的字符串是一样的。而借由一样的对象表示字符串反序列化而成的对象也是一样的。这真的是巧合吗?绝对不是!这是大家约定好的!
不论是XML还是JSON,其根本目的都是为了解决异构通信问题,比如C#和JS,两种不同的语言,只能通过文本来相互交换数据。JSON除了解决了XML冗余过多及解析复杂的问题外,最重大的创新是以一种更贴近编程语言的方式去描述数据。
百度上对JSON定义如下:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式。
所以JSON说到底是一种协议。这种协议借由文本格式来实现。不论是C#还是JavaScript里面,都不存在所谓JSON对象。
有人或许要问:
'[{"name":"echo"},{"age":30}]';这段文本为什么能转换成对象,呵呵,这种文本格式在js里面有个名字:叫对象字面量表示法,和C#中的对象初始化器像不像?
总结:
通过上述机制,可以很容易的将C#中的一个类序列化后传输到JS中再原地满血复活。同样的,JS中的序列化字符串也可以在C#中被反序列化,特别是借助linq to sql,EF等ORM框架的帮助,数据传输变得无比简单明了。
- JSON:C#与JS中的序列化与反序列化
- C#实现JSON序列化与反序列化介绍
- C# Json序列化与反序列化
- C#实现JSON序列化与反序列化介绍
- C# JSON字符串序列化与反序列化
- C# Json序列化与反序列化
- C# JSON字符串序列化与反序列化
- C# JSON字符串序列化与反序列化
- C# JSON字符串序列化与反序列化
- c# JSON序列化与反序列化
- C#编程之JSON序列化与反序列化
- C# JSON字符串序列化与反序列化
- C# Json 序列化与反序列化
- [参考]C# JSON字符串序列化与反序列化
- C# 对象JSON序列化与反序列化
- c#中json序列化与反序列化
- Newtonsoft.Json.dll 中的序列化与反序列化
- Json序列化 与反序列化
- linux命--find
- DICOM医学图像处理:基于DCMTK工具包学习和分析worklist
- Microsoft visual stdio 2010已停止工作-打开旧项目失败
- getchar()和EOF总结
- 教你如何用Android画一个几何图形
- JSON:C#与JS中的序列化与反序列化
- HA-Proxy 入门
- RectF Rect用法
- [小技巧] vim 中切换到不同的窗体
- Nim游戏和SG函数
- LVS入门
- java中请给一个Abstract类实现接口的实例!
- 使用 Windows 7 中的快捷键之 Windows 键的妙用
- 值得注意的7个 JavaScript 技巧