java 对象转json 某属性不序列化_json序列化时排除指定属性

上一篇博客讲了,当对象属性为空时,让它返回空字符串的问题。但这也引出另一个问题,那就是如果一个对象拥有很多属性,而且这些属性都为空,那样还是会把每个属性都返回,这些会加大不必要的传输流量。要解决这个问题,本人开始是想通过构造参数的方式来解决,但始终觉得不太方便,偶然又想起,在gson中可以通过注解annotation的方式解决排除属性问题,自己也思考了下,感觉那样确实更好一些。于是自己要稍微改了下代码,实现了此功能。

首先创建一个注解:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface Excluded {

}

这个注解相当的简单,没有任何属性,但这已经够了,用法如下:

private String userName;

@Excluded

private String password;

要让这个注解起到实际的作用,就得修改JSONObject的populateMap方法,上篇博客中的那两句代码稍微改下即可:

if(klass.getDeclaredField(key).getAnnotation(Excluded.class)==null){

Object result = method.invoke(bean, (Object[])null);

this.map.put(key, result==null?"":wrap(result));

}

经过这个简单的步骤后,这个注解就生效了。

后记,后来仔细看了下这个方法的实现,发现将注解用在getXXX方法上比用在字段上更好,于是再修改下Excluded:

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface Excluded {

}

再重新修改下populateMap方法最后部分代码:

if (key.length() > 0&& Character.isUpperCase(key.charAt(0))

&& method.getParameterTypes().length == 0

&& method.getAnnotation(Excluded.class) == null) {

if (key.length() == 1) {

key = key.toLowerCase();

} else if (!Character.isUpperCase(key.charAt(1))) {

key = key.substring(0, 1).toLowerCase()+ key.substring(1);

}

Object result = method.invoke(bean, (Object[]) null);

this.map.put(key, result == null ? "" : wrap(result));

}

这样相对来说更好,但在输出list时,每次都会新创建个JSONObject对象,而创建JSONObject时就会调用populateMap方法,所以list有多少个对象就会进行多少次判断。虽然这确实有些不合理,因为populateMap是将获取属性与属性值连在一起的,而实际上取属性只需要一次,而取值则需要多次,因此可以将这两个操作分开。但是仅仅这样做还不错,因为创建JSONArray时,分根据循环list创建JSONArray。所以JSONObject可以为JSONArray单独创建一个构造性,在此构造器中只调用获取属性的方法一次,多次调用获取值的方法即可。由于本人暂时没这个需要,所以在此只记录下实现思路。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值