本文转自: http://www.blogjava.net/fuhoujun/archive/2008/10/04/232324.html
Apache提供的一个插件包,可以把 Action中的数据以 JSON做个封装然后返回。
它会将整个 action中的变量转化为 JSON数据 (根对象在 JSON中数据添加一个 ”root”标识 )。如果要使用它, Action必须遵循以下几点:
- 返回的页面类型中 ”content-type”必须是 ”application/json”.(这个已经 Internet Community采用 ).
- JSON内容必须是符合格式要求的 .
- Action中 field必须有 public的 set方法 .(是不是没有 set方法就不会将 field添加到 JSON数据中,有待验证 ).
- 它支持的类型有 : 基本类型 (int,long...String), Date, List, Map, Primitive Arrays, 其它 class, 对象数组 .
- 在 JSON中任何的 Object会被封装在 list或 map中,数据会被封装程 Long,如果是含有的数据则会被封装程 Double,数组会被封装程 List.
下面给出 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>