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() *......... *} *List* *@authorFuchun *@sinceay-commons-lang1.0 *@version1.1.0 */ publicclassJSONUtils{ privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(JSONUtils.class); /**空的{@codeJSON}数据-userList=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"}] *
"{}"
。*/ 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; /** **
*JSONUtils
instancesshouldNOTbeconstructedinstandardprogramming.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}对象。 **
* *@paramtarget要转换成{@codeJSON}的目标对象。 *@return目标对象的{@codeJSON}格式的字符串。 *@since1.0 */ publicstaticStringtoJson(Objecttarget){ returntoJson(target,null,false,null,null,true); } /** *将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。 *- 该方法只会转换标有{@literal@Expose}注解的字段;
*- 该方法不会转换{@codenull}值字段;
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
**
* *@paramtarget要转换成{@codeJSON}的目标对象。 *@paramdatePattern日期字段的格式化模式。 *@return目标对象的{@codeJSON}格式的字符串。 *@since1.0 */ publicstaticStringtoJson(Objecttarget,StringdatePattern){ returntoJson(target,null,false,null,datePattern,true); } /** *将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。 *- 该方法只会转换标有{@literal@Expose}注解的字段;
*- 该方法不会转换{@codenull}值字段;
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
**
* *@paramtarget要转换成{@codeJSON}的目标对象。 *@paramversion字段的版本号注解({@literal@Since})。 *@return目标对象的{@codeJSON}格式的字符串。 *@since1.0 */ publicstaticStringtoJson(Objecttarget,Doubleversion){ returntoJson(target,null,false,version,null,true); } /** *将给定的目标对象转换成{@codeJSON}格式的字符串。此方法只用来转换普通的{@codeJavaBean}对象。 *- 该方法只会转换标有{@literal@Expose}注解的字段;
*- 该方法不会转换{@codenull}值字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@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}值字段;
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@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}格式的字符串。此方法通常用来转换使用泛型的对象。 *- 该方法不会转换{@codenull}值字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
**
* *@paramtarget要转换成{@codeJSON}的目标对象。 *@paramtargetType目标对象的类型。 *@return目标对象的{@codeJSON}格式的字符串。 *@since1.0 */ publicstaticStringtoJson(Objecttarget,TypetargetType){ returntoJson(target,targetType,false,null,null,true); } /** *将给定的目标对象转换成{@codeJSON}格式的字符串。此方法通常用来转换使用泛型的对象。 *- 该方法只会转换标有{@literal@Expose}注解的字段;
*- 该方法不会转换{@codenull}值字段;
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@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}格式的字符串。此方法通常用来转换使用泛型的对象。 *- 该方法只会转换标有{@literal@Expose}注解的字段;
*- 该方法不会转换{@codenull}值字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSSS};
**
* *@paramtarget要转换成{@codeJSON}的目标对象。 *@paramtargetType目标对象的类型。 *@paramexcludesFieldsWithoutExpose是否排除未标注{@literal@Expose}注解的字段。 *@return目标对象的{@codeJSON}格式的字符串。 *@since1.0 */ publicstaticStringtoJson(Objecttarget,TypetargetType,booleanexcludesFieldsWithoutExpose){ returntoJson(target,targetType,false,null,null,excludesFieldsWithoutExpose); } /** *将给定的目标对象转换成{@codeJSON}格式的字符串。此方法通常用来转换使用泛型的对象。 *- 该方法不会转换{@codenull}值字段;
*- 该方法会转换所有未标注或已标注{@literal@Since}的字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@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- 该方法不会转换{@codenull}值字段;
*- 该方法转换时使用默认的日期/时间格式化模式-{@codeyyyy-MM-ddHH:mm:ssSSS};
*要转换的目标类型。 *@paramjson给定的{@codeJSON}字符串。 *@paramtoken{@codecom.google.gson.reflect.TypeToken}的类型指示类对象。 *@paramdatePattern日期格式模式。 *@return给定的{@codeJSON}字符串表示的指定的类型对象。 *@since1.0 */ publicstatic TfromJson(Stringjson,TypeToken token,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 */ publicstatic TfromJson(Stringjson,TypeToken token){ returnfromJson(json,token,null); } /** *将给定的{@codeJSON}字符串转换成指定的类型对象。此方法通常用来转换普通的{@codeJavaBean}对象。 * *@param 要转换的目标类型。 *@paramjson给定的{@codeJSON}字符串。 *@paramclazz要转换的目标类。 *@paramdatePattern日期格式模式。 *@return给定的{@codeJSON}字符串表示的指定的类型对象。 *@since1.0 */ publicstatic TfromJson(Stringjson,Class clazz,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 */ publicstatic TfromJson(Stringjson,Class clazz){ 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/