`

【转】使用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内容转码等。

 

转自:http://www.tuicool.com/articles/Zf2QRf

分享到:
评论

相关推荐

    json-lib-2.4-jdk15.jar

    json-lib是一个Java库,它提供了一种方便的方式来序列化和反序列化Java对象为JSON格式,以及将JSON数据转换回Java对象。 json-lib-2.4-jdk15.jar是json-lib的一个特定版本,适用于JDK 1.5环境。这个版本的库包含了...

    java json-lib解决无循环的探索例子

    在Java中,当对象A持有对象B的引用,而对象B又持有对象A的引用时,如果不加以控制,json-lib在序列化或反序列化过程中会陷入无限循环,导致程序崩溃或消耗大量内存。这个问题通常发生在具有自引用或者相互引用的对象...

    jsonLib支持库

    在Java开发中,jsonLib是一个广泛使用的JSON处理库,它提供了丰富的API来帮助开发者进行JSON的序列化和反序列化操作。这篇博文主要探讨jsonLib支持库在Java开发中的应用和关键功能。 首先,jsonLib作为一个开源工具...

    json-lib 技术指南

    JSON-lib 是一个强大的 Java 库,它主要用于将 Java 对象转换为 JSON(JavaScript Object Notation)格式,同时也能实现 JSON 到 Java 对象的反序列化。此外,JSON-lib 还支持将数据转换为 XML 格式,为数据交换提供...

    json-lib-2.3.jar

    总之,json-lib是一个强大的JSON处理库,它简化了Java应用与JSON数据的交互,无论是序列化Java对象为JSON,还是将JSON数据还原为Java对象,都提供了便捷的API。通过对`JsonObject.fromObject()`和`JsonArray.from...

    json-lib-2.4-jdk15.jar及其相关依赖

    3. **反序列化**: 同样,`json-lib`也提供了反序列化功能,可以将JSON字符串转换回Java对象。例如: ```java String jsonString = "{\"name\":\"张三\",\"age\":30}"; Person person = (Person) JSONObject.toBean...

    JSON-lib框架,转换JSON、XML不再困难

    JSON-lib提供了将Java对象转换为JSON字符串,以及将JSON字符串反序列化回Java对象的功能。例如,你可以有一个简单的JavaBean,如`Student`类,包含id、name、email、address和一个`Birthday`类属性。通过JSON-lib,...

    JSON-lib

    JSON-lib允许通过实现`JsonConfig`接口并设置转换策略,来控制特定字段的序列化和反序列化行为。 7. **性能优化**:JSON-lib提供了几种不同的JSON实现,如Jackson、Gson等,可以根据性能需求选择最合适的实现。此外...

    json-lib.rar

    在使用`json-lib`时,开发者通常会先将Java对象转换成JSON格式的字符串,然后通过HTTP请求发送到服务器,或者接收服务器返回的JSON数据并反序列化回Java对象。例如,你可以使用`net.sf.json.JSONObject`类将一个...

    jsonlib需要jar包.zip

    JSON库如jsonlib在Java开发中起到了关键作用,它允许开发者将Java对象转换为JSON字符串,反之亦然,方便数据的序列化和反序列化。 `jsonlib需要jar包.zip`是一个包含jsonlib库的压缩文件,它提供了Java开发人员所需...

    使用json-lib自定义复杂类型转换为Json字符串

    在Java中,`json-lib`是一个非常实用的库,它提供了将Java对象转换为JSON字符串,以及将JSON字符串反序列化为Java对象的能力。本文将深入探讨如何使用`json-lib`来处理自定义复杂类型的转换,以便更有效地在后台和...

    json-lib JsonUtils 工具类,json-lib 工具类

    你可以通过实现`JsonConfig`接口来定制序列化和反序列化的策略。 7. **错误处理**: 在使用`JsonUtils`时,需要注意可能出现的异常,比如`JSONException`。当JSON格式错误或者类型转换不匹配时,这个异常会被抛出...

    简单数据传输对象 json-lib 及源文件

    JSON-lib是一个Java库,它提供了将Java对象转换为JSON表示以及从JSON文本反序列化回Java对象的功能。这个库使得在Java环境中处理JSON变得更加方便。 **1. JSON-Lib的用途** JSON-Lib主要服务于以下目的: - **Java...

    json-lib依赖包

    使用`json-lib`时,你可以创建一个`JsonConfig`对象来自定义序列化和反序列化的配置,然后使用`net.sf.json.JSONObject`或`net.sf.json.JSONArray`类来处理JSON数据。例如,将Java对象转换为JSON字符串: ```java ...

    json-lib(jar)

    6. **序列化与反序列化**:`json-lib`也提供了`JSONSerializer`和`JSONDeserializer`,它们可以用来序列化和反序列化复杂的Java对象结构。例如: ```java JSONSerializer serializer = new JSONSerializer(); ...

    json-lib-2.2.3帮助api

    - `JsonConfig`类允许设置序列化和反序列化的配置,如日期格式、是否忽略空值等。 5. **处理XML与JSON**: - json-lib还提供了将XML转换为JSON以及从JSON转换回XML的功能,这对于集成不同的数据格式非常有用。 6...

    json转换json-lib

    json-lib允许开发者通过实现`JsonConfig`类的自定义转换规则,以处理特殊类型的Java对象或者处理日期、时间的格式。 4. **XML与JSON互转**: json-lib还提供了XML与JSON之间的转换功能,这对于那些需要在XML和...

    json-lib-2.4-jdk15

    可以通过配置`JsonConfig`来指定日期和时间的序列化和反序列化格式。 7. **错误处理**:在转换过程中可能会遇到类型不匹配或格式错误等问题,需要正确处理这些异常,以确保程序的健壮性。 在`json-lib-2.4-jdk15...

    使用json-lib进行Java和JSON之间的转换

    首先,json-lib是一个Java库,它提供了一系列的方法来将Java对象转换为JSON格式的字符串,以及将JSON格式的字符串反序列化回Java对象。这个库对于那些不支持原生JSON处理的旧版本JDK尤其有用,因为Java 6及以上版本...

    json-lib整合包

    来创建和操作JSON对象,或者使用`JsonConfig`配置对象来定制序列化和反序列化的行为。 总之,json-lib是一个强大的JSON处理库,它提供了丰富的功能,使得在Java应用中处理JSON数据变得更加便捷。通过这个整合包,...

Global site tag (gtag.js) - Google Analytics