Json工具类使用Word文档格式.docx
《Json工具类使用Word文档格式.docx》由会员分享,可在线阅读,更多相关《Json工具类使用Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
publicJSONUtil(){}
/**
*代理类时做的检查.返回应该检查的对象.
*@parambean
*@return
*/
protectedObjectproxyCheck(Objectbean){
returnbean;
}
staticpublicStringtoJSONString(Objectobj)throwsJSONException{
returntoJSONString(obj,false);
staticpublicStringtoJSONString(Objectobj,booleanuseClassConvert)throwsJSONException{
if(instance==null)
instance=newJSONUtil();
returninstance.getJSONObject(obj,useClassConvert).toString();
privateStringgetJSONArray(ObjectarrayObj,booleanuseClassConvert)throwsJSONException{
if(arrayObj==null)
return"
null"
;
arrayObj=proxyCheck(arrayObj);
JSONArrayjSONArray=newJSONArray();
if(arrayObjinstanceofCollection){
Iteratoriterator=((Collection)arrayObj).iterator();
while(iterator.hasNext()){
ObjectrowObj=iterator.next();
if(rowObj==null)
jSONArray.put(newJSONStringObject(null));
elseif(rowObj.getClass().isArray()||rowObjinstanceofCollection)
jSONArray.put(getJSONArray(rowObj,useClassConvert));
else
jSONArray.put(getJSONObject(rowObj,useClassConvert));
if(arrayObj.getClass().isArray()){
intarrayLength=Array.getLength(arrayObj);
for(inti=0;
i<
arrayLength;
i++){
ObjectrowObj=Array.get(arrayObj,i);
returnjSONArray.toString();
JSONStringObjectgetJSONObject(Objectvalue,booleanuseClassConvert)throwsJSONException{
//处理原始类型
if(value==null){
returnnewJSONStringObject("
);
value=proxyCheck(value);
if(valueinstanceofJSONString){
Objecto;
try{
o=((JSONString)value).toJSONString();
}catch(Exceptione){
thrownewJSONException(e);
thrownewJSONException("
BadvaluefromtoJSONString:
"
+o);
if(valueinstanceofNumber){
returnnewJSONStringObject(JSONObject.numberToString((Number)value));
if(valueinstanceofBoolean||valueinstanceofJSONObject||
valueinstanceofJSONArray){
returnnewJSONStringObject(value.toString());
if(valueinstanceofString)
returnnewJSONStringObject(JSONObject.quote(value.toString()));
if(valueinstanceofMap){
JSONObjectjSONObject=newJSONObject();
Iteratoriterator=((Map)value).keySet().iterator();
Stringkey=iterator.next().toString();
ObjectvalueObj=((Map)value).get(key);
jSONObject.put(key,getJSONObject(valueObj,useClassConvert));
returnnewJSONStringObject(jSONObject.toString());
//class
if(valueinstanceofClass)
returnnewJSONStringObject(JSONObject.quote(((Class)value).getSimpleName()));
//数组
if(valueinstanceofCollection||value.getClass().isArray()){
returnnewJSONStringObject(getJSONArray(proxyCheck(value),useClassConvert));
returnreflectObject(value,useClassConvert);
}//value.equals(null)
privateJSONStringObjectreflectObject(Objectbean,booleanuseClassConvert){
Classklass=bean.getClass();
Method[]methods=klass.getMethods();
for(inti=0;
methods.length;
i+=1){
Methodmethod=methods[i];
Stringname=method.getName();
Stringkey="
"
if(name.startsWith("
get"
)){
key=name.substring(3);
}elseif(name.startsWith("
is"
key=name.substring
(2);
if(key.length()>
0&
&
Character.isUpperCase(key.charAt(0))&
method.getParameterTypes().length==0){
if(key.length()==1){
key=key.toLowerCase();
}elseif(!
Character.isUpperCase(key.charAt
(1))){
key=key.substring(0,1).toLowerCase()+
key.substring
(1);
ObjectelementObj=method.invoke(bean,null);
if(!
useClassConvert&
elementObjinstanceofClass)
continue;
jSONObject.put(key,getJSONObject(elementObj,useClassConvert));
/*forgetaboutit*/
}
publicclassJSONStringObjectimplementsJSONString{
privateStringjsonString=null;
publicJSONStringObject(StringjsonString){
this.jsonString=jsonString;
@Override
publicStringtoString(){
returnjsonString;
publicStringtoJSONString(){
调用测试程序
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
publicclassAObj{
privateintii=7;
privatebooleanbb=true;
privateStringss="
你好"
privateListaList=newArrayList();
publicAObj(){
aList.add("
hello"
aList.add(false);
aList.add(newBObj());
aList.add(newHashMap());
publicbooleanisBb(){
returnbb;
publicvoidsetBb(booleanbb){
this.bb=bb;
publicintgetIi(){
returnii;
publicvoidsetIi(intii){
this.ii=ii;
publicStringgetSs(){
returnss;
publicvoidsetSs(Stringss){
this.ss=ss;
publicListgetAList(){
returnaList;
publicvoidsetAList(Listlist){
aList=list;
importjava.math.BigDecimal;
publicclassBObj{
privateHashMapinnerhm=newHashMap();
publicBObj(){
doubledd=7.4354;
innerhm.put("
gigi"
"
高兴"
sina"
newBigDecimal(dd));
publicHashMapgetInnerhm(){
returninnerhm;
publicvoidsetInnerhm(HashMapinnerhm){
this.innerhm=innerhm;
publicclassCObjextendsAObj{
privateObject[]oarray=newObject[]{352,false,"
kick"
};
publicObject[]getOarray(){
returnoarray;
publicvoidsetOarray(Object[]oarray){
this.oarray=oarray;
importjava.util.*;
importcom.aherp.framework.util.HiJSONUtil;
importcom.aherp.framework.util.JSONUtil;
publicclassTest{
publicstaticvoidmain(String[]args)throwsJSONException{
CObjcObj=newCObj();
System.out.println("
varjsonStr="
+JSONObject.quote(JSONUtil.toJSONString(cObj))+"
}
}
输出:
{\"
AList\"
:
[\"
hello\"
false,{\"
innerhm\"
gigi\"
\"
高兴\"
\"
sina\"
7.4353999999999995651478457148186862468719482421875}},{}],\"
ii\"
7,\"
oarray\"
[352,false,\"
kick\"
],\"
ss\"
你好\"
bb\"
true}"
如果需要支持Hibernate,那么必须弄清其机制。
Hibernate采用CGLIB对VO对象进行字节码增加,实际机制就是使用一个原类型的proxy子类,其子类实现了HibernateProxy接口。
其接口有一个isUninitialized的判断方法,用来判断该代理类是否已经初始化(还记得在事务外使用延迟加载的对象会抛noSession的错误吗,正是由于实际使用的对象已经变成原来类的子类proxy了)。
而对于one-to-many映射时,很难判断对象只加载一次,因此为了避免递归调用死循环,忽略了Hibernate的one-to-many集合的递归反射。
其原理和many-to-one一样,也是一个子类化的proxy,具有PersistentSet的接口。
因此,支持Hibernate的JSONUtil如下:
importorg.hibernate.collection.PersistentSet;
importorg.hibernate.proxy.HibernateProxy;
importorg.hibernate.proxy.LazyInitializer;
*支持Hibernate的JSONUtil.
*自动检测是否已经代理加载,如果未加载,则将对象仅加载为OID
publicclassHiJSONUtilextendsJSONUtil{
privatestaticHiJSONUtilinstance=null;
staticpublicStringtoJSONString(Objectobj)throwsJSONException{
staticpublicStringtoJSONString(Objectobj,booleanuseClassConvert)throwsJSONException{
instance=newHiJSONUtil();
protectedObjectproxyCheck(Objectbean){
Sys