Java实现操作JSON的便捷工具类完整实例【重写Google的Gson】!
本文实例讲述了Java实现操作JSON的便捷工具类。分享给大家供大家参考,具体如下:
对于JSON数据格式的处理,自开发Java以来,已用过多种JSON的开源工具,用得最好,也用得最High的恐怕要属Google的Gson了。
特别为它写了一个工具类,放入常备工具中,方便使用。下面是为GSON1.5版本重写的工具类。
依赖包:
slf4j-api-1.6.0.jar
slf4j-log4j12-1.6.0.jar
log4j-1.2.15.jar
gson-1.5.jar
/**
*Copyright2010Fuchun.
*
*LicensedundertheApacheLicense,Version2.0(the"License");
*youmaynotusethisfileexceptincompliancewiththeLicense.
*YoumayobtainacopyoftheLicenseat
*http://www.apache.org/licenses/LICENSE-2.0
*
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software
*distributedundertheLicenseisdistributedonan"ASIS"BASIS,
*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
*SeetheLicenseforthespecificlanguagegoverningpermissionsand
*limitationsundertheLicense.
*/
packagemy.tools;
importjava.lang.reflect.Type;
importjava.util.Collection;
importjava.util.Enumeration;
importjava.util.Iterator;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importcom.google.gson.Gson;
importcom.google.gson.GsonBuilder;
importcom.google.gson.reflect.TypeToken;
importorg.apache.commons.lang.StringUtils;
/**
*包含操作{@codeJSON}数据的常用方法的工具类。
*
*该工具类使用的{@codeJSON}转换引擎是
*{@codeGoogleGson}。下面是工具类的使用案例:
*
*
*publicclassUser{
*@SerializedName("pwd")
*privateStringpassword;
*@Expose
*@SerializedName("uname")
*privateStringusername;
*@Expose
*@Since(1.1)
*privateStringgender;
*@Expose
*@Since(1.0)
*privateStringsex;
*
*publicUser(){}
*publicUser(Stringusername,Stringpassword,Stringgender){
*//userconstructorcode.........
*}
*
*publicStringgetUsername()
*.........
*}
*ListuserList=newLinkedList();
*Userjack=newUser("Jack","123456","Male");
*Usermarry=newUser("Marry","888888","Female");
*userList.add(jack);
*userList.add(marry);
*TypetargetType=newTypeToken>(){}.getType();
*StringsUserList1=JSONUtils.toJson(userList,targetType);
*sUserList1---->[{"uname":"jack","gender":"Male","sex":"Male"},{"uname":"marry","gender":"Female","sex":"Female"}]
*StringsUserList2=JSONUtils.toJson(userList,targetType,false);
*sUserList2---->[{"uname":"jack","pwd":"123456","gender":"Male","sex":"Male"},{"uname":"marry","pwd":"888888","gender":"Female","sex":"Female"}]
*StringsUserList3=JSONUtils.toJson(userList,targetType,1.0d,true);
*sUserList3---->[{"uname":"jack","sex":"Male"},{"uname":"marry","sex":"Female"}]
*
  
*
*@authorFuchun
*@sinceay-commons-lang1.0
*@version1.1.0
*/
publicclassJSONUtils{
privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(JSONUtils.class);
/**空的{@codeJSON}数据-"{}"。*/
publicstaticfinalStringEMPTY_JSON="{}";
/**空的{@codeJSON}数组(集合)数据-{@code"[]"}。*/
publicstaticfinalStringEMPTY_JSON_ARRAY="[]";
/**默认的{@codeJSON}日期/时间字段的格式化模式。*/
publicstaticfinalStringDEFAULT_DATE_PATTERN="yyyy-MM-ddHH:mm:ssSSS";
/**{@codeGoogleGson}的@Since注解常用的版本号常量-{@code1.0}。*/
publicstaticfinaldoubleSINCE_VERSION_10=1.0d;
/**{@codeGoogleGson}的@Since注解常用的版本号常量-{@code1.1}。*/
publicstaticfinaldoubleSINCE_VERSION_11=1.1d;
/**{@codeGoogleGson}的@Since注解常用的版本号常量-{@code1.2}。*/
publicstaticfinaldoubleSINCE_VERSION_12=1.2d;
/**{@codeGoogleGson}的@Until注解常用的版本号常量-{@code1.0}。*/
publicstaticfinaldoubleUNTIL_VERSION_10=SINCE_VERSION_10;
/**{@codeGoogleGson}的@Until注解常用的版本号常量-{@code1.1}。*/
publicstaticfinaldoubleUNTIL_VERSION_11=SINCE_VERSION_11;
/**{@codeGoogleGson}的@Until注解常用的版本号常量-{@code1.2}。*/
publicstaticfinaldoubleUNTIL_VERSION_12=SINCE_VERSION_12;
/**
*
*JSONUtilsinstancesshouldNOTbeconstructedinstandardprogramming.Instead,
*theclassshouldbeusedasJSONUtils.fromJson("foo");.
*
*
*ThisconstructorispublictopermittoolsthatrequireaJavaBeaninstancetooperate.
*
*/
publicJSONUtils(){
super();
}
/**
*将给定的目标对象根据指定的条件参数转换成{@codeJSON}格式的字符串。
*
*该方法转换发生错误时,不会抛出任何异常。若发生错误时,曾通对象返回"{}";集合或数组对象返回"[]"
*
*
*@paramtarget目标对象。
*@paramtargetType目标对象的类型。
*@paramisSerializeNulls是否序列化{@codenull}值字段。
*@paramversion字段的版本号注解。
*@paramdatePattern日期字段的格式化模式。
*@paramexcludesFieldsWithoutExpose是否排除未标注{@literal@Expose}注解的字段。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,TypetargetType,booleanisSerializeNulls,Doubleversion,
StringdatePattern,booleanexcludesFieldsWithoutExpose){
if(target==null)returnEMPTY_JSON;
GsonBuilderbuilder=newGsonBuilder();
if(isSerializeNulls)builder.serializeNulls();
if(version!=null)builder.setVersion(version.doubleValue());
if(StringUtils.isBlank(datePattern))datePattern=DEFAULT_DATE_PATTERN;
builder.setDateFormat(datePattern);
if(excludesFieldsWithoutExpose)builder.excludeFieldsWithoutExposeAnnotation();
returntoJson(target,targetType,builder);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。
*
*- 该方法只会转换标有{@literal@Expose}注解的字段;
 
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget){
returntoJson(target,null,false,null,null,true);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。
*
*- 该方法只会转换标有{@literal@Expose}注解的字段;
 
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramdatePattern日期字段的格式化模式。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,StringdatePattern){
returntoJson(target,null,false,null,datePattern,true);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。
*
*- 该方法只会转换标有{@literal@Expose}注解的字段;
 
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramversion字段的版本号注解({@literal@Since})。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,Doubleversion){
returntoJson(target,null,false,version,null,true);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。
*
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramexcludesFieldsWithoutExpose是否排除未标注{@literal@Expose}注解的字段。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,booleanexcludesFieldsWithoutExpose){
returntoJson(target,null,false,null,null,excludesFieldsWithoutExpose);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。
*
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramversion字段的版本号注解({@literal@Since})。
*@paramexcludesFieldsWithoutExpose是否排除未标注{@literal@Expose}注解的字段。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,Doubleversion,booleanexcludesFieldsWithoutExpose){
returntoJson(target,null,false,version,null,excludesFieldsWithoutExpose);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法通常用来转换使用泛型的对象。
*
*- 该方法只会转换标有{@literal@Expose}注解的字段;
 
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramtargetType目标对象的类型。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,TypetargetType){
returntoJson(target,targetType,false,null,null,true);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法通常用来转换使用泛型的对象。
*
*- 该方法只会转换标有{@literal@Expose}注解的字段;
 
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramtargetType目标对象的类型。
*@paramversion字段的版本号注解({@literal@Since})。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,TypetargetType,Doubleversion){
returntoJson(target,targetType,false,version,null,true);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法通常用来转换使用泛型的对象。
*
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramtargetType目标对象的类型。
*@paramexcludesFieldsWithoutExpose是否排除未标注{@literal@Expose}注解的字段。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,TypetargetType,booleanexcludesFieldsWithoutExpose){
returntoJson(target,targetType,false,null,null,excludesFieldsWithoutExpose);
}
/**
*将给定的目标对象转换成{@codeJSON}格式的字符串。此方法通常用来转换使用泛型的对象。
*
*- 该方法不会转换{@codenull}值字段;
 
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
 
*
*
*@paramtarget要转换成{@codeJSON}的目标对象。
*@paramtargetType目标对象的类型。
*@paramversion字段的版本号注解({@literal@Since})。
*@paramexcludesFieldsWithoutExpose是否排除未标注{@literal@Expose}注解的字段。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.0
*/
publicstaticStringtoJson(Objecttarget,TypetargetType,Doubleversion,booleanexcludesFieldsWithoutExpose){
returntoJson(target,targetType,false,version,null,excludesFieldsWithoutExpose);
}
/**
*将给定的{@codeJSON}字符串转换成指定的类型对象。
*
*@param要转换的目标类型。
*@paramjson给定的{@codeJSON}字符串。
*@paramtoken{@codecom.google.gson.reflect.TypeToken}的类型指示类对象。
*@paramdatePattern日期格式模式。
*@return给定的{@codeJSON}字符串表示的指定的类型对象。
*@since1.0
*/
publicstaticTfromJson(Stringjson,TypeTokentoken,StringdatePattern){
if(StringUtils.isBlank(json)){
returnnull;
}
GsonBuilderbuilder=newGsonBuilder();
if(StringUtils.isBlank(datePattern)){
datePattern=DEFAULT_DATE_PATTERN;
}
Gsongson=builder.create();
try{
returngson.fromJson(json,token.getType());
}catch(Exceptionex){
LOGGER.error(json+"无法转换为"+token.getRawType().getName()+"对象!",ex);
returnnull;
}
}
/**
*将给定的{@codeJSON}字符串转换成指定的类型对象。
*
*@param要转换的目标类型。
*@paramjson给定的{@codeJSON}字符串。
*@paramtoken{@codecom.google.gson.reflect.TypeToken}的类型指示类对象。
*@return给定的{@codeJSON}字符串表示的指定的类型对象。
*@since1.0
*/
publicstaticTfromJson(Stringjson,TypeTokentoken){
returnfromJson(json,token,null);
}
/**
*将给定的{@codeJSON}字符串转换成指定的类型对象。此方法通常用来转换普通的{@codeJavaBean}对象。
*
*@param要转换的目标类型。
*@paramjson给定的{@codeJSON}字符串。
*@paramclazz要转换的目标类。
*@paramdatePattern日期格式模式。
*@return给定的{@codeJSON}字符串表示的指定的类型对象。
*@since1.0
*/
publicstaticTfromJson(Stringjson,Classclazz,StringdatePattern){
if(StringUtils.isBlank(json)){
returnnull;
}
GsonBuilderbuilder=newGsonBuilder();
if(StringUtils.isBlank(datePattern)){
datePattern=DEFAULT_DATE_PATTERN;
}
Gsongson=builder.create();
try{
returngson.fromJson(json,clazz);
}catch(Exceptionex){
LOGGER.error(json+"无法转换为"+clazz.getName()+"对象!",ex);
returnnull;
}
}
/**
*将给定的{@codeJSON}字符串转换成指定的类型对象。此方法通常用来转换普通的{@codeJavaBean}对象。
*
*@param要转换的目标类型。
*@paramjson给定的{@codeJSON}字符串。
*@paramclazz要转换的目标类。
*@return给定的{@codeJSON}字符串表示的指定的类型对象。
*@since1.0
*/
publicstaticTfromJson(Stringjson,Classclazz){
returnfromJson(json,clazz,null);
}
/**
*将给定的目标对象根据{@codeGsonBuilder}所指定的条件参数转换成{@codeJSON}格式的字符串。
*
*该方法转换发生错误时,不会抛出任何异常。若发生错误时,{@codeJavaBean}对象返回"{}";集合或数组对象返回
*"[]"。其本基本类型,返回相应的基本值。
*
*@paramtarget目标对象。
*@paramtargetType目标对象的类型。
*@parambuilder可定制的{@codeGson}构建器。
*@return目标对象的{@codeJSON}格式的字符串。
*@since1.1
*/
publicstaticStringtoJson(Objecttarget,TypetargetType,GsonBuilderbuilder){
if(target==null)returnEMPTY_JSON;
Gsongson=null;
if(builder==null){
gson=newGson();
}else{
gson=builder.create();
}
Stringresult=EMPTY_JSON;
try{
if(targetType==null){
result=gson.toJson(target);
}else{
result=gson.toJson(target,targetType);
}
}catch(Exceptionex){
LOGGER.warn("目标对象"+target.getClass().getName()+"转换JSON字符串时,发生异常!",ex);
if(targetinstanceofCollection>||targetinstanceofIterator>||targetinstanceofEnumeration>
||target.getClass().isArray()){
result=EMPTY_JSON_ARRAY;
}
}
returnresult;
}
}
             
PS:关于json操作,这里再为大家推荐几款比较实用的json在线工具供大家参考使用:
在线
JSON在线格式化工具:
http://tools.jb51.net/code/jsonformat
在线XML/