`
Clayz
  • 浏览: 293643 次
  • 性别: Icon_minigender_1
  • 来自: 东京
社区版块
存档分类
最新评论

Struts2 Jsonplugin 详解

阅读更多

本文转自: 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>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics