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支持

找到.文件,在其中的在之后添加如下的内容:其中指的是要使用JSON,值得是通过HTTP调用服务器上的服务方法。客户端构造JSON数据客户端需要使用包内的类来组装JSON格式的数据,数据格式如下:数据类型JSONArrayJSONBoolean说明JSONValue构成的数组类型JSONboolean值访问JSON结构的数据出错的情况下可以抛出此异JSONException常JSONNullJSONNumberJSONObjectJSONNull根式的数据JSONNumber类型的数据JSONObject类型的数据将String格式的JSON数据解析为JSONValue类JSONParser型的数据JSONStringJSONValueJSONString类型的数据所有JSON类型值的超级类型组合一个简单的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.7.8.9.10.11.12.13.14.

"/dtds/">然后我们的Action中需要返回的json信息需要加上注解Java代码1.//on;ist;;;Support;classJsonActionextendsActionSupport{estaticfinallongserialVersionUID=-4669835L;ser=newUsers();erList=newArrayList();StringtestUser(){n("inthejsonActon");it();(user);SUCCESS;23.}voiduserInit(){

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...codejsonplugin0.26...MavenPluginRepository/svn/trunk/falsetrueCustomizingSerializationandDeserializationUsetheJSONannotationtocustomizetheserialization/bleJSONannotationfields:NamenameDescriptionCustomizefieldnameIncludeinserializationIncludeindeserializationDefaultValueemptySerializationDeserializationyesnoserializetrueyesnodeserializetruenoyes

Formatusedtoformatformat/parseaDatefield"yyyy-MM-dd'T'HH:mm:ss"yesyesExcludingpropertiesAcomma-delimitedlistofregularexpressionscanbepassedtotheJSONResultandInterceptor,propertiesmatchinganyoftheseregularexpressionswillbeignoredontheserializationprocess:rd,studentList.*.sintruerd,studentList.*.sinIncludingpropertiesAcomma-delimitedlistofregularexpressionscanbopertiesmatchingclude,ifyouuseincludeandexcludepropertyexpressionsonthesameresult,includepropertyexpressionswillnotbeappliedifanexcludeexcludepropertyexpressionmatchesapropertyfirst.^entries[d+].clientNumber,

^entries[d+].scheduleNumber,^entries[d+].createUserIdRootObjectUsethe"root"attribute(OGNLexpression)tospecifytherootobjecttobeserialized.The"root"attribute(OGNLexpression)canalsobeusedontheinterceptortospecifytheobjectthatmustbepopulated,makesurethisobjectisnotnull.2Wrapwmple,["*/alert('XSS');/*"]ThankstoDouglasCrockfordforthetip!Ifthe"wrapWithComments"(falsebydefault)attributeissettotrue,thegeneratedJSONiswrappedwithcommentslike:/*{"doubleVal":10.10,"nestedBean":{"name":"MrBean"},"list":["A",10,20.20,{"firstName":"ElZorro"}],"array":[10,20]}*/

pthosecommentsuse:varresponseObject=eval("("+ing(f("*")+2,dexOf("*"))+")");BaseClassesBydefaultpropertiesdefinedonbaseclassesofthe"root"objectwon'tbeserialized,toserializepropertiesinallbaseclasses(uptoObject)set"ignoreHierarchy"tofalseintheJSONresult:falseEnumerationsBydefault,anEnumisserializedasaname=valuepairwherevalue=name().publicenumAnEnum{ValueA,ValueB}JSON:"myEnum":"ValueA"Usethe"enumAsBean"resultparametertoserializeEnum'sasabeanwithaspecialproperty_namewithvaluename().enumAnEnum{ValueA("A"),ValueB("B");privateStringval;publicAnEnum(val){=val;}publicgetVal(){returnval;}}JSON:myEnum:{"_name":"ValueA","val":"A"}:

trueuestmustinclude"gzip"inthe"Accept-Encoding"headerforthistowork.trueExampleSetupActionThissimpleactionhassomefields:Example:p;;;publicclassJSONExample{privateStringfield1="str";privateint[]ints={10,20};privateMapmap=newHashMap();privateStringcustomName="custom";//'transient'fieldsarenotserializedprivatetransientStringfield2;//fieldswithoutgettermethodarenotserializedprivateStringfield3;publicStringexecute(){("John","Galt");S;}publicStringgetField1(){

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:

JSONexampleoutput{"field1":"str","ints":[10,20],"map":{"John":"Galt"},"newName":"custom"}JSONRPCThejsonpluginaturewasdevelopedwithDojoinmind,'sworkitoutwithanexample(uselessasmostexamples).Firstwritetheaction:toadvertisepackagesmd;hod;;publicclassSMDAction{publicStringsmd(){S;}@SMDMethodpublicBeandoSomething(Beanbean,intquantity){ce(quantity*10);returnbean;}}MethodsthatwillbecalledremotelymustbeannotatedwiththeSMDMethodannotation,hodwilltakeabeanobject,ioncanbeannotatedwiththeSMDannotationtocustomizethegeneratedSMD(moreonthat

soon),ansee,wehavea"dummy",thodwillbeusedtogeneratetheSimpleMethodDefinition(adefinitionofalltheservicesprovidedbythisclass),usingthe"json"nclass:packagesmd;publicclassBean{privateStringtype;privateintprice;publicStringgetType(){returntype;}publicvoidsetType(Stringtype){=type;}publicintgetPrice(){returnprice;}publicvoidsetPrice(intprice){=price;}}Themapping:truetrueNothingspecialhere,exceptthatboththeinterceptorandtheresultmustbeappliedtotheaction,and"enableSMD"mustbeenabledforboth.

Nowthejavascriptcode://e(".*");//createserviceobject(proxy)usingSMD(generatedbythejsonresult)varservice=rvice("${smdUrl}");//functioncalledwhenremotemethodreturnsvarcallback=function(bean){alert("Pricefor"++"is"+);};//parametervarbean={type:"Mocca"};//executeremotemethodvardefered=thing(bean,5);//lback(callback);Dojo'sJsonServicewillmakearequesttotheactiontoloadtheSMD,whichwillreturnaJSONobjectwiththedefinitionoftheavailableremotemethods,usingthatinformationDojocreatesa"proxy"eoftheasynchronousnatureoftherequest,whenthemethodisexecuted,adeferredobjectisreturned,lbac'dobjects(V0.20)AsannotationsarenotinheritedinJava,someusermigsituation,comethis,setthe"ignoreInterfaces"resultparametertofalse(truebydefault)torequestthattheplugininspectsallinterfacesandsuperclassesoftheactionforannotationsontheaction'smethods.

NOTE:Thisparametershouldonlybesettofalseifyouractioncouldbeaproxyasthereisaperformancecostcausedbyrecursionthroughtheinterfaces.truefalsetruefalse在Struts2中使用JSonajax支持来源:作者:发布时间:2007-12-19JSON插件提供了一种名为json的ResultType,一旦为某个Action指定了一个类型为json的Result,则该Result无需映射到任何视图资源。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的数据,并将该数据返回给客户端页面的JavaScript。简单地说,JSON插件允许我们在JavaScript中异步调用Action,而且Action不再需要使用视图资源来显示该Action里的状态信息,而是由JSON插件负责将Action里的状态信息返回给调用页面——通过这种方式,就能够完成Ajax交互。Struts2提供了一种可插拔方式来管理插件,安装Struts2的JSON插件和安装普通插件并没有太大的区别,相同只需要将Struts2插件的JAR文档复制到Web应用的WEB-INF/lib路径下即可。安装JSON插件按如下步骤进行:(1)登陆/p/jsonplugin/downloads/list站点,下载Struts2的JSON插件的最新版本,当前最新版本是0.7,我们能够下载该版本的JSON插件。(2)将下载到的文档复制到Web应用的WEB-INF路径

下,即可完成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。


本文标签: 数据 插件 格式 使用 类型