zoukankan      html  css  js  c++  java
  • 使用JsonConfig控制JSON lib序列化

    将对象转换成字符串,是非常常用的功能,尤其在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", "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;
    
    /**
     * 
     * @author 杨胜寒
     * @date 2013-6-27
     *
     */
    public class User {
    
       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;
       }
    
       public static void main(String[] args) {
          JsonConfig config = new JsonConfig();  
          config.setExcludes( new String[]{"password"});
          User user = new User(12L, "JSON", "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(12L, "JSON", "json");
    System.out.println(JSONObject.fromObject(user, config).toString());

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

    JsonConfig config = new JsonConfig();
    config.registerPropertyExclusions(User.class, new String[]{"password"});
    User user = new User(12L, "JSON", "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(12L, "JSON", "json");
    System.out.println(JSONObject.fromObject(user, config).toString());

    自定义JsonValueProcessor

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

    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, config).toString());

    除了自定义日期格式外,还可以如法炮制,控制数值格式化、HTML内容转码等。

  • 相关阅读:
    安装openssl后yum不能使用的解决办法
    使用xShell 连接 docker 使用说明
    /usr/bin/ld: cannot find -lcrypto
    Mac包管理神器:Home-brew
    FinalShell远程连接工具推荐
    make编译出错 usr/bin/ld: /data/app/openssl/lib/libcrypto.a(ecs_asn1.o): relocation R_X86_64_PC32 against symbol `ECDSA_SIG_it' can not be used when making a shared object; recompile with -fPIC
    交叉编译环境搭建
    安装Gitlab
    Git的详细使用
    服务器里Centos 7安装KVM,并通过KVM安装Centos 7
  • 原文地址:https://www.cnblogs.com/mybloging/p/6876734.html
Copyright © 2011-2022 走看看