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

配置 JSONname

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数据中,如果不想这样做,需要在配置时指定 ignoreHierarchyfalse:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值