码迷,mamicode.com
首页 > Web开发 > 详细

struts2 json插件中属性的配置

时间:2014-07-27 10:32:42      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:

root参数用于指定要序列化的根对象,如果省去这一配置,表示要序列化action中的所有属性

ignoreHierarchy 为false时表示要序列化根对象的所有基类

excludeProperties表示排除的序列化的属性

includeProperties表示哪些属性被序列化

excludeNullProperties表示是否去掉空值, 默认值是false,如果设置为true会自动将为空的值过滤,只输出不为空的值。

之前我在看李刚的书的时候认为includeProperties和excludePropertis直接设为对应的属性就会完全序列化为json,其实不是的,这两个属性的值实际上是

正则表达式,根据传入的正则表达式然后根据OGNL得到对应的属性。

下面的一个domain类

 

public class Point
{
    private double lng;//经度
    private double lat;//纬度
    
    public Point()
    {
        
    }
    public Point(double lng, double lat)
    {
        this.lat = lat;
        this.lng = lng;
    }
                //省略setter getter方法
}

Action为:

public class DrawMarkerAction extends ActionSupport
{    
    private List<Point> points;
    private Point point;
//省略getter setter。。。
//省略execute
}             

struts.xml:

<action name="drawMarkerAction"
class="com.needle.map.action.DrawMarkerAction">
<result type="json">
       <param name="noCache">true</param>
       <param name="includeProperties">points</param>         </result>
</action>

我本来认为如果想上面这样配置action就会得到整个points数组,可实际情况是得到的json为:

{"points":[]}
也就是仅仅得到了points,而points内的对象、属性都没得到。也就是说includeProperties属性值仅仅导航到points数组,而没有有进一步向内,那么如果希望得到points的所有对象
以及对象的属性该怎么写呢
下面先再看几个例子: 前面是struts.xml配置 后面是得到的json
points\[\d\] ==》 {"points":[{},{}]} 仅仅导航到集合对象,而没能到属性 匹配的是 points[0] 这样的ognl
points.* ==》{"points":[{"lat":3.0,"lng":1.0},{"lat":4.0,"lng":3.0}]} 得到了集合的所有对象和属性 匹配所有属性 例如 points[0].lng points[1].lat
从上面的例子中我们就能发现其实就是大多数使用正则表达式去匹配ognl,导航的那一层就仅仅显示那一层,而不会把这一层里面的显示出来。
point.*==》{"point":{"lat":3.0,"lng":1.0},"points":[{"lat":3.0,"lng":1.0},{"lat":4.0,"lng":3.0}]}
正则匹配的是point.lng point.lat points[0].lat points[0].lng
除了上面所说的我还发现了一个有趣的情况,看下面的三种情况:
point.*==>可以得到point和points的所有属性,这个还没有什么问题
point..* ==> 仅仅能得到points集合的所有属性,得不到point的属性了,刚开始我很疑惑,point..*不是可以匹配point.lat point.lng吗,那为什么不能得到point的属性呢?
后来我突然想明白了,应为point..* 不能匹配point呀! 哇哈哈!!! 这就是原因!! 其实我还是不是完全明白,下面是我猜测的情况:
1.如果是精确匹配 例如point\.lat 这样可以准确定位到point.lat的情况,就无需先匹配point。
2.对于不是精确匹配的情况,必须先找到point才能向下继续找,例如point..* 因为找不到point,所以虽然匹配point.lat也还是不行。
印证我的猜测的例子是point\.lat 和point.lat,如果是正则的话,这两个正则表达式都可以匹配point.lat,但是前一个是精确匹配,后一个是模糊匹配,如果按照我的猜测
point\.lat 得到的json应该是{"point":{"lat”:3}} 而point.lat是模糊匹配,虽然能匹配到point.lat但是不能匹配point,所以得到的json是{}。我测试的结果就是
这样!!! bingo!! 暂时就先按照这种情况理解吧!!!
对应集合这种原则也是可以的,例如现在我希望仅仅获得points[0]中的所有属性,如果这样写:points\[0\].*,那么得到的json为{},原因也是:因为这是模糊匹配,所以虽然可以
匹配到points[0],但是匹配不到points所以不行,正确的写法是points,points\[\d\].*,也就是说如果希望模糊匹配到points[0].lat,必须首先能匹配到points,然后能匹配到points[0].
最后还有一种情况是在正则表达式中以*开头是会报错的,但是在这里*是通配符的意思,如果以*开头,那么不论后面怎么写,都会得到所有属性。

根据上面红色标出的三种情况,我们就可以得到常用的一些情况的写法:
1.得到某个对象field的所有属性: point.*,不能写成point..* 或者point.+
2.得到某一个对象field的某一个属性: point\.lat,不能写成pont.lat;当然写成point,point.lat也是可以的。

从上面我们会发现其实这样单独使用includeProperities是很麻烦的,例如如果我们希望得到points集合的全部属性,那么使用root则最为方便
<param name="root">points</param> ==》[{"lat":3.0,"lng":1.0},{"lat":4.0,"lng":3.0}] 如果同时使用root和includeProperties,那么就是在root的基础上使用includeProperties。
例如现在以points为root,查找第一个对象的lat属性:
<param name="root">points</param>

<param name="includeProperties">\[0\]\.lat</param> 同样应该注意如果使用模糊匹配的话,则应该在匹配points[0].lat之前首先匹配points[0]。也就是想下面这样写:
<param name="root">points</param>
<param name="includeProperties">\[0\].lat,\[0\]</param>
最后还要补充的是一定要注意在使用root是就是以root指定的为ognl的根元素,所以如果上面这样写:
<param name="root">points</param> 



<param name="includeProperties">points\[0\]\.lat</param>
得到json为[](注意是[],而不死{},这说明是以points为根),因为在points为根的情况下,points[0].lat是匹配不到任何属性的。

 

struts2 json插件中属性的配置

标签:

原文地址:http://www.cnblogs.com/zh1164/p/3870650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!