Json   发布时间:2022-04-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用JsonConfig控制JSON lib序列化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

原文http://www.yshjava.cn/post/546.html

将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用JSON lib能够便捷地完成这项工作。JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象。

无论出于何种原因,某些时候,我们需要对对象转为字符串的过程加以控制,最常见需求如数值格式化和日期格式化。JSON lib提供了JsonConfig对象,该对象能够深刻影响Java对象转成json字符串的行为。

增加忽略的属性

1. 第一种方式,实现JSONString接口的方法

package cn.ysh.studio.test;

import java.io.serializable;

import net.sf.json.JSONObject;
import net.sf.json.JSONString;

/**
 * 
 * @author 杨胜寒
 * @date 2013-6-27
 *
 */
public class User implements JSONString,serializable{

   private static final long serialVersionUID = 1L;
   private long id;
   private String name;
   private String password;
   
   public User(){}
   
   public User(Long id,String name,String password){
      this.id = id;
      this.name = name;
      this.password = password;
   }
   
   public User(String name,String password){
      this.name = name;
      this.password = password;
   }
   
   public long getId() {
      return id;
   }

   public void setId(long id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String Name) {
      this.name = name;
   }

   public String getpassword() {
      return password;
   }

   public void setpassword(String password) {
      this.password = password;
   }

   @Override
   public String toJSONString() {
      //return "{\"id\":" + this.id + ",\"name\":\"" + this.name + "\",\"password\":\""+ this.password +"\"}";
      //忽略敏感字段password
      return "{\"id\":" + this.id + ",\"name\":\"" + this.name + "\"}";
   }
   
   public static void main(String[] args) {
      User user = new User(12L,"JSON",68)">"json");
      System.out.println(JSONObject.fromObject(user).toString());
   }
}

2.第二种方式,通过jsonconfig实例,对包含和需要排除的属性进行方便添加删除

package cn.ysh.studio.test;

import java.io.serializable;

import net.sf.json.JSONObject;
import net.sf.json.JSONString;
import net.sf.json.JsonConfig;

class User {

   private long id;
   private String name;
   private String password;
   
   public User(){}
   
   public User(Long id,String password){
      this.name = name;
      this.password = password;
   }
   
   public long getId() {
      return id;
   }

   public void setId(long id) {
      this.id = id;
   }

   public String getName() {
      return name;
   }

   public void setName(String Name) {
      this.name = name;
   }

   public String getpassword() {
      return password;
   }

   public void setpassword(String password) {
      this.password = password;
   }

   public static void main(String[] args) {
      JsonConfig config = new JsonConfig();  
      config.setExcludes( new String[]{"password"});
      User user = new User("json");
      System.out.println(JSONObject.fromObject(user,config).toString());
   }
}

属性过滤器

使用propertyFilter可以允许同时对需要排除的属性和类进行控制,这种控制还可以是双向的,也可以应用到json字符串到java对象

JsonConfig config = new JsonConfig();  
config.setJsonPropertyFilter(new PropertyFilter() {
   
   @Override
   public Boolean apply(Object source/* 属性的拥有者 */,String name /*属性名字*/,Object value/* 属性值 */) {
      return source instanceof User && "password".equalsIgnoreCase(Name);
   }
});
User user = new User("json");
System.out.println(JSONObject.fromObject(user,config).toString());

相对于上面的何种方式,如下的方式或许更为简便

JsonConfig config = new JsonConfig();
config.registerPropertyExclusions(User.class,new String[]{"password"});
User user = new User("json");
System.out.println(JSONObject.fromObject(user,config).toString());

自定义JsonBeanProcessor

JsonBeanProcessor和实现JsonString很类似,返回一个代表原来目标对象的合法JSONObject

JsonConfig config = new JsonConfig();
config.registerJsonBeanProcessor(User.class,new JsonBeanProcessor() {

   @Override
   public JSONObject processBean(Object bean,JsonConfig config) {
      User user = (User) bean;
      return new JSONObject().element("id",user.getId()).element("name",user.getName());
   }
});
User user = new User( 自定义JsonValueProcessor 

比如我们要控制JSON序列化过程中的Date对象的格式化,以及数值的格式化,JsonValueProcessor是最好的选择。

@H_44_152@map<String,Object> map = new HashMap<String,Object>(); map.put("date",new Date()); map.put("dates",Arrays.asList(new Date())); JsonConfig config = new JsonConfig(); config.registerJsonValueProcessor(Date.class,new JsonValueProcessor() { //自定义日期格式 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); @Override /** * 处理单个Date对象 */ public Object processObjectValue(String propertyName,Object date,JsonConfig config) { return simpleDateFormat.format(datE); } @Override /** * 处理数组中的Date对象 */ public Object processArrayValue(Object date,JsonConfig config) { return simpleDateFormat.format(datE); } }); System.out.println(JSONObject.fromObject(map,254)"> 除了自定义日期格式外,还可以如法炮制,控制数值格式化、HTML内容转码等。

大佬总结

以上是大佬教程为你收集整理的使用JsonConfig控制JSON lib序列化全部内容,希望文章能够帮你解决使用JsonConfig控制JSON lib序列化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。