从XML到JSON在目前应用开发常见的B/S架构下,我们会遇到很多需要前后端数据传输的场景。在这个传输过程中,数据以什么格式传输,方法是否快捷方便,写法是否简单易学,都成为程序员在开发时不得不考虑的问题。1996年,W3C(万维网联盟,WorldWideWebConsortium)正式公布了XML1.0标准。XML使用一种标准格式为基于Web的应用程序提供统一的数据描述和数据交换标准。与HTML着重解决“:如何在浏览器中显示文件”不同,XML更着重于解决:“如何以结构化的方式描述数据”。(需要注意的是,XML不是一种编程语言,而是一种跨语言的数据格式。)XML本身并不复杂,只是加入了W3C制定的DTD、XSD、XPath、XSLT等20多个标准之后,这种简单的数据交换格式变得复杂起来。每当程序员遇到它的时候,只能是头大。经过半个月的潜心研究,我不能轻易说什么都懂了。这时,另一个推动技术的蒸汽机也被点燃了——Ajax技术大行其道,越来越多地反映出XML不可忽视的缺点。XML的实现是基于DOM树的,DOM在各种浏览器中的实现细节不尽相同,所以XML的跨浏览器兼容性不好。这时需要在HTML页面中集成一种新的数据加载格式,以满足Ajax的要求。终于在2002年,也就是XML诞生的第八年,DouglasCrockford开始使用JSON这种轻量级的数据交换格式。第一条JSON报文发出后,最让人吃惊的是,这不是一种新的数据格式,是JavaScript。document.domain='fudco';parent.session.receive({to:"session",do:"test",text:"Helloworld"})由于数据内容本身就是JavaScript,所以不用再做任何额外的解析,使用JS编译器将处理一切。因为JSON非常简单,所以很快风靡Web世界,成为ECMA标准。几乎所有的编程语言都有解析JSON的库,而在JavaScript中,我们可以直接使用JSON,因为JavaScript内置了JSON解析。将一个JavaScript对象转成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样就可以通过网络传输到其他计算机上。如果我们接收到一个JSON格式的字符串,我们只需要将它反序列化为一个JavaScript对象,我们就可以直接在JavaScript中使用这个对象。Json的序列化和反序列化就像一道菜,做好了就要上盘,前后端数据传输也是如此。将数据通过指定的格式序列化为二进制数据流,再通过反序列化将数据流的内容转换为对应的数据对象。JSON中的数据形式和转换方式在JSON中,数据有以下几种形式:object:一个无序的“key/value”,格式如array:用于设置数值顺序,格式如string:任意数量的Unicode共有三种字符、格式等数据序列化和反序列化的方法:使用JavaScriptSerializer类使用DataContractJsonSerializer类使用JSON.NET类库以JavaScriptSerializer类为例,//创建用户列表List>(serializedResult);只要调用相应的方法,就可以直接实现数据内容的序列化。你以为就在这里?当然不是。在实际应用中,数据本身的处理并不困难。真正需要考虑的问题是数据本身的附加属性和设置。以我们自己为例,客户对纯前端电子表格中JSON数据传输的真正需求是,这条数据需要保证所有可视化内容的完整传输。纯前端表格中的JSON数据处理实际处理用户需求时,用户如下图设置cell后,不仅是cell中的数字,还有cell自身的样式,自定义函数,自定义格式、自定义函数迷你图、自定义标签和自定义行过滤。当我们打开相关代码时,我们可以清楚地看到格式中单元格的设置已经被保留了下来。在这张图中,我们可以看到不同类型的数据内容可以完成序列化和反序列化的过程。在使用自定义序列化的过程中,查看相关代码。序列化的核心是typeName字段调用toJSON函数的过程。例如,您可以将此类名称与窗口对象相关联。反序列化时调用getTypeFromString函数获取类型名并构造类型实例对象,然后在类型实例上调用fromJSON方法。除此之外,还有很多其他的属性内容。下面是其他样式设置的例子:Backgroundimage://这个例子设置了backgroundImageLayout属性。varstyle=newGC.Spread.Sheets.Style();style.backColor="lightgreen";style.backgroundImage="/css/images/quarter1.png";style.backgroundImageLayout=GC.Spread.Sheets.ImageLayout.center;activeSheet.setStyle(1,1,style,GC.Spread.Sheets.SheetArea.viewport);水印设置://此示例设置水印的单元格填充。vartype=newGC.Spread.Sheets.Style();type.watermark="Username";type.cellPadding="20";type.labelOptions={alignment:GC.Spread.Sheets.LabelAlignment.topLeft,可见性:GC.Spread.Sheets.LabelVisibility.visible};activeSheet.setStyle(0,1,类型);activeSheet.getRange(0,-1,1,-1,GC.Spread.Sheets.SheetArea.viewport).height(60);activeSheet.getRange(-1,1,-1,1).width(150);varcombo=newGC.Spread.Sheets.CellTypes.ComboBox();combo.items([{text:"橘子",价值:“11k”},{文本:“苹果”,价值:“15k”},{文本:“葡萄”,价值:“100k”}]);combo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.text);activeSheet.setCellType(2,1,combo,GC.Spread.Sheets.SheetArea.viewport);activeSheet.getCell(2,1,GC.Spread.Sheets.SheetArea.viewport).watermark("组合框单元格类型").cellPadding('10102010');activeSheet.getCell(2,1,GC.Spread.Sheets.SheetArea.viewport).labelOptions({alignment:GC.Spread.Sheets.LabelAlignment.bottomCenter,foreCol或:'yellowgreen',字体:'bold15pxArial'});activeSheet.getRange(2,-1,1,-1,GC.Spread.Sheets.SheetArea.viewport).height(60);themefont://本例使用themeFont属性varstyle=newGC.Spread.Sheets.Style();style.formatter="0.000%";style.themeFont="Body";activeSheet.setStyle(1,1,样式,GC.Spread.Sheets.SheetArea.viewport);activeSheet.getCell(1,1).value("11");单元格的设置也有很多,这些样式和内容完全可以作为json数据保存传输。带来realformjson数据传输的便利。使用时需要注意以下问题:为typeName字段设置完整的类型名称字符串(如果有命名空间,还应该包括命名空间)。如果自定义类型有循环依赖,或者你想减少JSON数据的大小,或者你有其他更高级的要求,那么你的自定义类型需要重写toJSON和fromJSON方法。如果自定义类型定义在一个闭包中,换句话说,你不想在window对象上定义自定义类型,你需要重写getTypeFromString函数来手动解析类型字符串。代码示例:GC.Spread.Sheets.getTypeFromString=function(typeString){switch(typeString){case"MyFormatter":returnMyFormatter;case"MyRowFilter":返回MyRowFilter;默认值:返回oldFun.apply(this,arguments);}};MyTag.prototype.toJSON=function(){return{typeName:this.typeName,//必要的名字:this.name,age:this.age};};MyTag.prototype.fromJSON=function(settings){if(settings.name!==undefined){this.name=settings.name;}if(settings.age!==undefined){this.age=settings.age;}};总结本文详细介绍了数据传输从XML到JSON的故事,以及json序列化和反序列化的工作原理,同时向大家展示了如何在前端全面实现整个内容的数据序列化和反序列化电子表格。后续会给大家带来更多有趣或者严肃的内容~我觉得还不错,走之前给我点个赞吧。延伸阅读SpreadJS产品官网SpreadJSON导入/导出自定义属性序列化
