`

【转】使用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-lib2.4

    大家都知道jsonlib2.4之后有了属性过滤的功能,就是当把一个bean转成json的时候能指定哪些属性输出哪些不输出,不过代码很难看,如下 JsonConfig config = new JsonConfig(); config.setJsonPropertyFilter(new ...

    JsonConfig:基于json的配置框架

    配置文件JsonConfig 是一个简单的配置框架,基于 json 和 .NET Framework 4.0+ 中可用的动态类型入门在您的项目中,添加对 JsonConfig.dll 的引用使用 json 格式的配置将名为“app.json.config”的文件添加到您的...

    JsonConfig:使用JSON和C#4.0动态功能的简单配置库

    JsonConfig自述文件关于JsonConfig是一个易于使用的配置库,它允许C#/。NET应用程序使用基于JSON的配置文件,而不必使用繁琐的web.config / application.config xml文件。 它基于JsonFX和C#4.0动态功能。 允许将...

    json-lib-2.1 2.2 2.3 2.4-jdk15

    JSONArray.fromObject(map)报错:Could not initialize class net.sf.json.JsonConfig。ireport 需要高于2.1版本的包。于是就找了这些包。最后2.2.2适合

    jsonex:Java对象序列化器和反序列化器为JSON格式。 专注于配置友好性,任意对象序列化和紧凑的JSON格式

    Jsonex JSONCoder是一个轻量级的通用对象序列化/反序列化库,类似于Jackson,GSON或FastJson。 多年来,该库已在各种eBay项目中广泛使用。 它不能替代其他流行的库。 但是,它解决了一些其他替代产品无法提供或无法...

    java jsonto对象互转

    JSONArray jsonArray = JSONArray.fromObject(jsonString, jsonConfig); JSONObject jsonObject; Object pojoValue; List&lt;T&gt; list = new ArrayList(); for (int i = 0; i (); i++) { jsonObject = jsonArray....

    ezmorph-1.0.6.jar

    使用json时候将会用到的一个jar包,发现这个包在网上提供的比较少.缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig 使用json时候将会用到的一个jar包,发现这个包在网上提供的比较少.缺少这个...

    JSON net.sf.json jar包

    JSON net.sf.json 依赖的jar包 亲测可用 一次导入所有jar包

    swift-JSONConfig-一个Swift3JSON配置读取库

    JSON Config - 一个Swift 3 JSON配置读取库。读取JSON文件从服务器端配置

    net.sf.json依赖包

    在用到net.sf.json的时候有时候会因为缺少依赖库而报错,此时可以试试这个包

    java后端返回json给前端

    java后端返回json给前端,包含对象JsonObject,JsonConfig,JsonArray.

    java解析json

    json-lib-2.4-jdk15 demo: package com; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import ...

    json所用到的jar包

    json开发所需要的jar包,fastjson-1.2.2.jar,fastjson-1.2.2-sources.jar,json.jar。不用到处找了

    JSONConfig:抽象重新配置文件类,交替xml,同时支持json文件

    JSONConfig:抽象重新配置文件类,交替xml,同时支持json文件

    JSONObject(net.sf.json)jar包和依赖包

    通过JSONObject json = ... 进入此方法后会继续调用fromObject(Object, JsonConfig)的重载方法,在此重载方法中会通过instanceOf判断待转换的Object对象是否是枚举、注解等类型,这些特殊类型会有特别的判断方法。

    ezmorph.jar v1.0.6免费版.zip

    ezmorph.jar包是在使用json时候将会用到jar包,缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig,给大家提供ezmorph-1.0.6.jar,有需要的赶快下载吧! ezmorph.jar基本简介 EZMorph是一个...

    json-lib出现There is a cycle in the hierarchy解决办法

    设置JSON-LIB让其过滤掉引起循环的字段。 Java代码 代码如下: JsonConfig config = new JsonConfig(); config.setIgnoreDefaultExcludes(false); config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT)...

    parseConfig:Golang写的json配置文件解析工具

    ├── config.go├── config.jsonconfig.json内容{ "name" : "akkuman", "urls" : ["xx.com","ww.com"], "info" : { "qq" : "123456", "weixin": "123456" }}该库取出来的都是类型为interface{}的数据,如需取出...

    springboot-json-config

    springboot-json-configconfig.json mysql Redis动态配置 不通过spring默认配置,并使用通用mapper(tk.mapper)

    【JSON解析】浅谈JSONObject的使用

    在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成、易于理解、阅读和撰写,而且Json采用完全独立于...

Global site tag (gtag.js) - Google Analytics