admin 管理员组文章数量: 887021
2023年12月18日发(作者:election词根)
JSON是什么?JSON的全称是JavaScriptObjectNotation,是一种轻量级的数据交换格式。JSON与XML具有相同的特性,例如易于人编写和阅读,易于机器生成和解析。但是JSON比XML数据传输的有效性要高出很多。JSON完全独立与编程语言,使用文本格式保存。JSON数据有两种结构:••Name-Value对构成的集合,类似于Java中的Map。Value的有序列表,类似于Java中的Array。一个JSON格式的数据示例:{"Name":"Apple","Expiry":"2007/10/1113:54","Price":3.99,"Sizes":["Small","Medium","Large"]}更多关于JSON数据格式的说明参看JSON官方网站:(中文内容参看:/)GWT与JSONGWT中支持的客户端服务器端方法调用和数据传递的标准格式是RPC。JSON并不是GWT支持的标准的数据传递格式。那么如何使用JSON来作为GWT的数据传递格式呢?需要以下几步。第一,引用HTTP和JSON支持。第二,在客户端创建JSON数据,提交到服务器第三,在服务器上重写数据格式解析的代码,使之支持JSON格式的数据第四,在服务器上组织JSON格式的数据,返回给客户端。第五,客户端解析服务器传回的JSON数据,正确的显示引用HTTP和JSON支持
找到.文件,在其中的
JSONObjectinput=newJSONObject();JSONStringvalue=newJSONString("mazhao");("name",value);JSON数据格式为:{name:"mazhao"}组合一个包含数组类型的复杂JSON数据:JSONObjectinput=newJSONObject();JSONStringvalue=newJSONString("mazhao");("name",value);JSONArrayarrayValue=newJSONArray();(0,newJSONString("arrayitem0"));(1,newJSONString("arrayitem1"));(2,newJSONString("arrayitem2"));("array",arrayValue);JSON数据格式为:{name:"mazhao",array:{"arrayitem0","arrayitem1","arrayitem2"}}注意上述的JSON类型的数据,使用的都是包内的类型。这些类型最终会被编译为JavaScript执行。服务端重写数据解析代码,支持JSON格式的数据在服务器上,需要使用JSONJava支持类才能将JSON格式的数据转换为各种类型的数据,当然也可以自己写一些解析用的代码。这里我们使用了上的代码来完成。这组代码与的代码很相似,只是在包内部。怎么解析JSON术诀呢?针对上述中的复杂的JSON数据:{name:"mazhao",array:{"arrayitem0","arrayitem1","arrayitem2"}}可以使用如下的方式解析:JSONObjectjsonObject=newJSONObject(payload);Stringname=ing("name");
n("nameis:"+name);JSONArrayjsonArray=NArray("array");for(inti=0;i<();i++){n("item"+i+":"+ing(i));}其中payload指的是上述的JSON格式的数据。那么如何写GWT的Service来得到Payload的数据呢?需要两点,第一,需要建立一个Service类,第二,覆盖父类的processCall方法。示例代码:;izationException;ServiceServlet;orldService;ray;ception;ject;/***CreatedbyIntelliJIDEA.*User:vaio*Date:2007-9-4*Time:22:08:31*TochangethistemplateuseFile|Settings|FileTemplates.*/publicclassHelloWorldServiceImplextendsRemoteServiceServletimplementsHelloWorldService{publicStringprocessCall(Stringpayload)throwsSerializationException{try{JSONObjectjsonObject=newJSONObject(payload);Stringname=ing("name");n("nameis:"+name);JSONArrayjsonArray=NArray("array");for(inti=0;i<();i++){n("item"+i+":"+ing(i));}}catch(JSONExceptione){tackTrace();//TochangebodyofcatchstatementuseFile|
Settings|FileTemplates.}return"success";}}在服务器上组织JSON格式的数据,返回给客户端同上客户端解析服务器传回的JSON数据,正确的显示同上Struts2返回json需要jsonplugin-0[1].25的包然后我们的配置文件中需要继承json-defaultJava代码1.2.5.6.
"/dtds/">
26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.}(1);e("张泽峰");sword("nofengPassword");}@JSON(name="userString")publicUsersgetUser(){returnuser;}@JSON(name="userList")publicListgetUserList(){returnuserList;}publicvoidsetUser(Usersuser){=user;}publicvoidsetUserList(ListuserList){st=userList;}JSONPlugin的说明EditPageBrowseSpaceAddPageAddNewsAddedbyMusachyBarroso,lasteditedbyghostrolleronJul04,2008(viewchange)SHOWCOMMENTNamePublisherLicenseVersionCompatibilityHomepageDownloadJSONPluginMusachyBarrosoOpenSource(ASL2)0.30Struts2.0.6orlater/p/jsonplugin//p/jsonplugin/downloads/list
••Rating?•12345••OverviewTheJSONpluginprovidesa"json"ializationprocessisrecursive,meaningthatthewholeobjectgraph,startingontheactionclass(baseclassnotincluded)willbeserialized(rootobjectcanbecustomizedusingthe"root"attribute).Iftheinterceptorisused,theactionwillbepopulatedfromtheJSONcontentintherequest,thesearetherulesoftheinterceptor:"content-type"mustbe"application/json"TheJSONcontentmustbewellformed,musthaveapublic"setter"tedtypesforpopulationare:Primitives(String),Date,List,Map,PrimitiveArrays,Otherclass(moreonthislater),ectinJSON,thatistobepopulatedinsidealist,oramap,willbeoftypeMap(mappingfrompropertiestovalues),anywholenumberwillbeoftypeLong,anydecimalnumberwillbeoftypeDouble,hisJSONstring:{"doubleValue":10.10,"nestedBean":{"name":"MrBean"},"list":["A",10,20.20,{"firstName":"ElZorro"}],"array":[10,20]}Theactionmusthavea"setDoubleValue"method,takingeithera"float"ora"double"argument(theinterceptorwillconvertthevaluetotherightone).Theremustbea"setNestedBean"whoseargumenttypecanbeanyclass,thathasa"setName"methodtakingasargumentan"String".Theremustbea"setList"methodthattakesa"List"asargument,thatlistwillcontain:"A"(String),10(Long),20.20(Double),Map("firstName"->"ElZorro").The"setArray"methodcantakeasparametereithera"List",oranynumericarray.
InstallationThisplugincanbeinstalledbycopyingthepluginjarintoyourapplication'aven,addthistoyourpom:/WEB-INF/lib
Formatusedtoformatformat/parseaDatefield"yyyy-MM-dd'T'HH:mm:ss"yesyesExcludingpropertiesAcomma-delimitedlistofregularexpressionscanbepassedtotheJSONResultandInterceptor,propertiesmatchinganyoftheseregularexpressionswillbeignoredontheserializationprocess:
^entries[d+].scheduleNumber,^entries[d+].createUserIdRootObjectUsethe"root"attribute(OGNLexpression)tospecifytherootobjecttobeserialized.
pthosecommentsuse:varresponseObject=eval("("+ing(f("*")+2,dexOf("*"))+")");BaseClassesBydefaultpropertiesdefinedonbaseclassesofthe"root"objectwon'tbeserialized,toserializepropertiesinallbaseclasses(uptoObject)set"ignoreHierarchy"tofalseintheJSONresult:
returnfield1;}publicvoidsetField1(Stringfield1){1=field1;}publicint[]getInts(){returnints;}publicvoidsetInts(int[]ints){=ints;}publicMapgetMap(){returnmap;}publicvoidsetMap(Mapmap){=map;}@JSON(name="newName")publicStringgetCustomName(){Name;}}mapinsideapackagethatextends"json-default"Addaresultoftype"json"Example:
soon),ansee,wehavea"dummy",thodwillbeusedtogeneratetheSimpleMethodDefinition(adefinitionofalltheservicesprovidedbythisclass),usingthe"json"nclass:packagesmd;publicclassBean{privateStringtype;privateintprice;publicStringgetType(){returntype;}publicvoidsetType(Stringtype){=type;}publicintgetPrice(){returnprice;}publicvoidsetPrice(intprice){=price;}}Themapping:
Nowthejavascriptcode:
NOTE:Thisparametershouldonlybesettofalseifyouractioncouldbeaproxyasthereisaperformancecostcausedbyrecursionthroughtheinterfaces.
下,即可完成JSON插件的安装。实现Actio逻辑假设wo,en输入页面中包含了三个表单域,这三个表单域对于三个请求参数,因此应该使用Action来封装这三个请求参数。三个表单域的name分别为field1、field2和field3。处理该请求的Action类代码如下:publicclassJSONExample{//封装请求参数的三个属性privateStringfield1;privatetransientStringfield2;privateStringfield3;//封装处理结果的属性privateint[]ints={10,20};privateMapmap=newHashMap();privateStringcustomName="custom";//三个请求参数对应的setter和getter方法publicStringgetField1(){returnfield1;}publicvoidsetField1(Stringfield1){1=field1;}//此处省略了field1和field2两个字段的setter和getter方法...//封装处理结果的属性的setter和getter方法publicint[]getInts(){returnints;}publicvoidsetInts(int[]ints){=ints;}publicMapgetMap(){returnmap;}
publicvoidsetMap(Mapmap){=map;}//使用注释语法来改变该属性序列化后的属性名@JSON(name="newName")publicStringgetCustomName(){Name;}publicStringexecute(){("name","yeeku");S;}}在上面代码中,使用了JSON注释,注释时指定了name域,name域指定Action属性被序列化成JSON对象的属性名。除此之外,JSON注释还支持如下几个域:serialize:配置是否序列化该属性deserialize:配置是否反序列化该属性。format:配置用于格式化输出、解析日期表单域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。配置该Action和配置普通Action存在小小的区别,应该为该Action配置类型为json的Result。而这个Result无需配置任何视图资源。配置该Action的文档代码如下:<?xmlversion="1.0"encoding="GBK"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""/dtds/"><struts><constantname="ng"value="UTF-8"/><packagename="example"extends="json-default"><actionname="JSONExample"class="ample"><resulttype="json"/></action></package></struts>在上面配置文档中有两个值得注意的地方:
第一个地方是配置ng常量时,不再是使用GBK编码,而是UTF-8编码,这是因为Ajax的POST请求都是以UTF-8的方式进行编码的。第二个地方是配置包时,自己的包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
版权声明:本文标题:JSON教程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1702883522h434541.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论