本文转自: http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html
Apache提供的一个插件包,可以把 Action中的数据以 JSON做个封装然后返回。
它会将整个 action中的变量转化为 JSON数据 (根对象在 JSON中数据添加一个 ”root”标识 )。如果要使用它, Action必须遵循以下几点:
下面给出 JSON的数据格式:
{
"doubleValue": 10.10,
"nestedBean": { "name": "Mr Bean" },
"list": ["A", 10, 20.20, { "firstName": "El Zorro" }],
"array": [10, 20]
}
这个插件支持以下几个注释 :
注释名 |
简介 |
默认值 |
序列化 |
反序列化 |
name |
配置 JSON 中 name |
empty |
yes |
no |
serialize |
在 serialization 中 |
true |
yes |
no |
deserialize |
在 deserialization 中 |
true |
no |
yes |
format |
格式化 Date 字段 |
"yyyy-MM-dd'T'HH:mm:ss" |
yes |
yes |
可以通过配置来显示指出要放在 JSON中 field,其中有个自己的验证规则需要研究 .
<!-- Result fragment --> <result type="json"> <param name="excludeProperties"> login.password, studentList.*".sin </param> </result> <!-- Interceptor fragment --> <interceptor-ref name="json"> <param name="enableSMD">true</param> <param name="excludeProperties"> login.password, studentList.*".sin </param> </interceptor-ref>
根对象
<result type="json"> <param name="root"> person.job </param> </result>
也可以使用拦截器配置操作父对象
<interceptor-ref name="json"> <param name="root">bean1.bean2</param> </interceptor-ref>
将 JSON数据用注释封装
如果 wrapWithComments 设置为 true( 默认值为 false) ,则生成的 JSON 数据会变成这样
/* { "doubleVal": 10.10, "nestedBean": { "name": "Mr Bean" }, "list": ["A", 10, 20.20, { "firstName": "El Zorro" }], "array": [10, 20] } */
这样做可以避免 js中一些潜在的风险,使用时需要 :Var responseObject = eval("("+data.substring(data.indexOf(""/"*")+2, data.lastIndexOf(""*"/"))+")");
父类
“root”对象中父类的 field不会(会?) 默认存放到 JSON数据中,如果不想这样做,需要在配置时指定 ignoreHierarchy 为 false:
<result type="json"> <param name="ignoreHierarchy">false</param> </result>
枚举类型
默认处理枚举类型时,会被处理成 JSON数据中 name等于枚举中 value而 value等于枚举中 name.
public enum AnEnum { ValueA, ValueB }
JSON: "myEnum":"ValueA"
如果在处理枚举类型时,在 xml中配置了 enumAsBean,则会被当作一个 Bean处理,在 JSON数据中会有一个特别的属性 ”_name”值为 name().这个枚举中的所有属性都会被处理 .
public enum AnEnum { ValueA("A"), ValueB("B"); private String val; public AnEnum(val) { this.val = val; } public getVal() { return val; } }
JSON: myEnum: { "_name": "ValueA", "val": "A" }
Xml中配置 :
<result type="json"> <param name="enumAsBean">true</param> </result>