`
guyinglong
  • 浏览: 73907 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

Json工具类,Object转Json对象,支持Hibernate的延迟加载对象

    博客分类:
  • json
阅读更多
Json工具类,Object转Json对象,支持Hibernate的延迟加载对象
(转贴IY部落 http://www.diybl.com/course/3_program/java/javajs/200818/96028.html)

代码:

package com.aherp.framework.util;

import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONString;

/**
* JSON工具类,反射的方式转换整个对象
* @author Jim Wu
*
*/
public class JSONUtil{

   private static JSONUtil instance = null;
   
   public JSONUtil(){}
  
   /**
    * 代理类时做的检查.返回应该检查的对象.
    * @param bean
    * @return
    */
    protected Object proxyCheck(Object bean){
        return bean;
    }

    static public String toJSONString(Object obj) throws JSONException{
        return toJSONString(obj, false);
    }
   
    static public String toJSONString(Object obj, boolean useClassConvert) throws JSONException{
        if(instance == null)
            instance = new JSONUtil();
        return instance.getJSONObject(obj, useClassConvert).toString();
    }

    private String getJSONArray(Object arrayObj, boolean useClassConvert) throws JSONException{
       
        if(arrayObj == null)
            return "null";
       
        arrayObj = proxyCheck(arrayObj);
       
        JSONArray jSONArray = new JSONArray();
        if(arrayObj instanceof Collection){
            Iterator iterator = ((Collection)arrayObj).iterator();
            while(iterator.hasNext()){
                Object rowObj = iterator.next();
                if(rowObj == null)
                    jSONArray.put(new JSONStringObject(null));
                else if(rowObj.getClass().isArray() || rowObj instanceof Collection)
                    jSONArray.put(getJSONArray(rowObj, useClassConvert));
                else
                    jSONArray.put(getJSONObject(rowObj, useClassConvert));
            }
        }
        if(arrayObj.getClass().isArray()){
            int arrayLength = Array.getLength(arrayObj);
            for(int i = 0; i < arrayLength; i ++){
                Object rowObj = Array.get(arrayObj, i);
                if(rowObj == null)
                    jSONArray.put(new JSONStringObject(null));
                else if(rowObj.getClass().isArray() || rowObj instanceof Collection)
                    jSONArray.put(getJSONArray(rowObj, useClassConvert));
                else
                    jSONArray.put(getJSONObject(rowObj, useClassConvert));
            }
        }
        return jSONArray.toString();
    }

    JSONStringObject getJSONObject(Object value, boolean useClassConvert) throws JSONException{

        //处理原始类型
        if (value == null) {
            return new JSONStringObject("null");
        }
        value = proxyCheck(value);
        if (value instanceof JSONString) {
            Object o;
            try {
                o = ((JSONString)value).toJSONString();
            } catch (Exception e) {
                throw new JSONException(e);
            }
            throw new JSONException("Bad value from toJSONString: " + o);
        }
        if (value instanceof Number){
            return new JSONStringObject(JSONObject.numberToString((Number) value));
        }
        if (value instanceof Boolean || value instanceof JSONObject ||
                value instanceof JSONArray) {
            return new JSONStringObject(value.toString());
        }
        if (value instanceof String)
            return new JSONStringObject(JSONObject.quote(value.toString()));
        if (value instanceof Map) {
           
            JSONObject jSONObject = new JSONObject();

            Iterator iterator = ((Map)value).keySet().iterator();
            while(iterator.hasNext()){
                String key = iterator.next().toString();
                Object valueObj = ((Map)value).get(key);
                jSONObject.put(key, getJSONObject(valueObj, useClassConvert));
            }
            return new JSONStringObject(jSONObject.toString());
        }

        //class
        if(value instanceof Class)
            return new JSONStringObject(JSONObject.quote(((Class)value).getSimpleName()));
       
        //数组
        if (value instanceof Collection || value.getClass().isArray()) {
            return new JSONStringObject(getJSONArray(proxyCheck(value), useClassConvert));
        }

        return reflectObject(value, useClassConvert);
    }//value.equals(null)

    private JSONStringObject reflectObject(Object bean, boolean useClassConvert) {
        JSONObject jSONObject = new JSONObject();

        Class klass = bean.getClass();
        Method[] methods = klass.getMethods();
        for (int i = 0; i < methods.length; i += 1) {
            try {
                Method method = methods[i];
                String name = method.getName();
                String key = "";
                if (name.startsWith("get")) {
                    key = name.substring(3);
                } else if (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();
                    } else if (!Character.isUpperCase(key.charAt(1))) {
                        key = key.substring(0, 1).toLowerCase() +
                            key.substring(1);
                    }
                    Object elementObj = method.invoke(bean, null);
                    if(!useClassConvert && elementObj instanceof Class)
                        continue;

                    jSONObject.put(key, getJSONObject(elementObj, useClassConvert));
                }
            } catch (Exception e) {
                 /* forget about it */
            }
        }
        return new JSONStringObject(jSONObject.toString());
    }
}





package com.aherp.framework.util;

import org.json.JSONString;

public class JSONStringObject implements JSONString {

    private String jsonString = null;
   
    public JSONStringObject(String jsonString) {
        this.jsonString = jsonString;
    }

    @Override
    public String toString() {
        return jsonString;
    }

    public String toJSONString() {
        return jsonString;
    }
}

调用测试程序
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class AObj {
    private int ii = 7;
    private boolean bb = true;
    private String ss = "你好";
    private List aList = new ArrayList();

    public AObj(){
        aList.add("hello");
        aList.add(false);
        aList.add(new BObj());
        aList.add(new HashMap());
    }
   
    public boolean isBb() {
        return bb;
    }
    public void setBb(boolean bb) {
        this.bb = bb;
    }
    public int getIi() {
        return ii;
    }
    public void setIi(int ii) {
        this.ii = ii;
    }
    public String getSs() {
        return ss;
    }
    public void setSs(String ss) {
        this.ss = ss;
    }
    public List getAList() {
        return aList;
    }
    public void setAList(List list) {
        aList = list;
    }
}


import java.math.BigDecimal;
import java.util.HashMap;


public class BObj {

    private HashMap innerhm = new HashMap();
   
    public BObj() {
        double dd = 7.4354;
        innerhm.put("gigi", "高兴");
        innerhm.put("sina", new BigDecimal(dd));
    }

    public HashMap getInnerhm() {
        return innerhm;
    }

    public void setInnerhm(HashMap innerhm) {
        this.innerhm = innerhm;
    }
}



public class CObj extends AObj {

    private Object[] oarray = new Object[] {352, false, "kick"};

    public Object[] getOarray() {
        return oarray;
    }

    public void setOarray(Object[] oarray) {
        this.oarray = oarray;
    }
}


import java.util.*;

import org.json.JSONException;
import org.json.JSONObject;

import com.aherp.framework.util.HiJSONUtil;
import com.aherp.framework.util.JSONUtil;

public class Test {  
    public static void main(String[] args) throws JSONException {
        CObj cObj = new CObj();
        System.out.println("var jsonStr = " + JSONObject.quote(JSONUtil.toJSONString(cObj))+";");
    }  



输出:
var jsonStr = "{\"AList\":[\"hello\",false,{\"innerhm\":{\"gigi\":\"高兴\",\"sina\":7.4353999999999995651478457148186862468719482421875}},{}],\"ii\":7,\"oarray\":[352,false,\"kick\"],\"ss\":\"你好\",\"bb\":true}";

如果需要支持Hibernate,那么必须弄清其机制。Hibernate采用CGLIB对VO对象进行字节码增加,实际机制就是使用一个原类型的proxy子类,其子类实现了HibernateProxy接口。其接口有一个isUninitialized的判断方法,用来判断该代理类是否已经初始化(还记得在事务外使用延迟加载的对象会抛no Session的错误吗,正是由于实际使用的对象已经变成原来类的子类proxy了)。而对于one-to-many映射时,很难判断对象只加载一次,因此为了避免递归调用死循环,忽略了Hibernate的one-to-many集合的递归反射。其原理和many-to-one一样,也是一个子类化的proxy,具有PersistentSet的接口。

因此,支持Hibernate的JSONUtil如下:


package com.aherp.framework.util;

import org.hibernate.collection.PersistentSet;
import org.hibernate.proxy.HibernateProxy;
import org.hibernate.proxy.LazyInitializer;
import org.json.JSONException;

/**
* 支持Hibernate的JSONUtil.
* 自动检测是否已经代理加载,如果未加载,则将对象仅加载为OID
* @author Jim Wu
*
*/
public class HiJSONUtil extends JSONUtil {

    private static HiJSONUtil instance = null;

    static public String toJSONString(Object obj) throws JSONException {
        return toJSONString(obj, false);
    }
   
    static public String toJSONString(Object obj, boolean useClassConvert) throws JSONException {
        if(instance == null)
            instance = new HiJSONUtil();
        return instance.getJSONObject(obj, useClassConvert).toString();
    }

    @Override
    protected Object proxyCheck(Object bean) {
        System.out.println("Class is " + bean.getClass().getName());
        if(bean instanceof HibernateProxy) {
            LazyInitializer lazyInitializer = ((HibernateProxy)bean).getHibernateLazyInitializer();
            if(lazyInitializer.isUninitialized()) {
                System.out.println(">>>>>lazyInitializer.getIdentifier()="+ lazyInitializer.getIdentifier());
                return lazyInitializer.getIdentifier();
            }
        }
        if(bean instanceof PersistentSet) {
            return new String[] {}; //忽略hibernate one-to-many
        }
        return bean;
    }
}

分享到:
评论

相关推荐

    Json工具类使用.docx

    `JSONUtil` 类就是一个这样的工具类,它提供了将Java对象转换为JSON对象的功能,并且特别地,它还支持Hibernate的延迟加载对象。 在描述中提到的`JSONUtil`类,它的主要功能是通过反射机制将Java对象转换为JSON格式...

    json转换工具jackson

    - **序列化**: Jackson 提供了 `ObjectMapper` 类,通过 `writeValueAsString()` 或 `writeValueAsBytes()` 方法可以将Java对象转换成JSON字符串或字节数组。 - **反序列化**: 使用 `readValue()` 方法,可以将...

    json转换工具

    类的静态方法`fromObject()`将Java对象转换为JSON对象。例如,如果你有一个`User`对象,可以这样转换: ```java User user = new User(); // 设置user属性... JSONObject jsonObject = JSONObject.fromObject...

    json帮助类

    例如,`commons-beanutils-1.8.3.jar`是该库的一个版本,它包含了用于操作JavaBean的各种工具类。BeanUtils库可以帮助开发者轻松地读取和设置JavaBean的属性,这对于JSON数据与Java对象的转换过程非常重要,因为JSON...

    springmvc spring hibernate ajax json

    3. **Hibernate** 被用作ORM工具,处理数据库操作,可能包括实体类、配置文件和SessionFactory的设置。 4. **Ajax** 可能在前端用于异步请求,向后端发送JSON数据,获取服务器响应。 5. **JSON** 数据在服务器与...

    json.libjar包

    6. **NetJSONSerializer**: 序列化Java对象到JSON的工具类,可以处理复杂对象结构。 使用`json-lib`进行JSON操作的一般步骤如下: 1. 创建或获取JSON对象:你可以通过`JSONObject.fromObject()`将Java对象转换为...

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()...此工程中就是解决List, Object&gt;&gt;转化为JavaBean工具类实现

    json相关的jar包

    `json-lib-2.4-jdk15 (1).jar` 和 `json-lib-2.4-jdk15.jar` 是针对JDK1.5版本的2.4版本,这个库不仅支持基本类型和集合的转换,还支持转换Hibernate和JavaBean等复杂对象。 3. **Ezmorph** - Ezmorph库(`ezmorph-...

    json-lib-2.3-jdk15基础jar包合辑

    - **数据存储**:在持久化框架如Hibernate中,JSON Lib可以用于将Java对象转换成JSON字符串,方便存储到数据库的JSON字段。 - **前端交互**:后端开发中,通过JSON格式与前端JavaScript进行数据交互,JSON Lib简化了...

    net.sf.json 及相关jar包

    2. **XML与JSON互转**:除了基本的Java对象和JSON的转换,`net.sf.json`还支持XML到JSON以及JSON到XML的转换,使得不同格式的数据交换变得便捷。 3. **JSON格式处理**:库中提供了丰富的API来处理JSON,例如解析...

    springmvc_hibernate+json lib包

    Hibernate支持实体类、持久化、查询语言(HQL)和第二级缓存等特性,提高了开发效率并降低了维护成本。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...

    json-lib-2.4-jdk15

    - 对象转JSON:如果你有一个Java Bean或Map对象,你可以直接调用 `JSONObject.fromObject(object)` 将其转换为JSON对象。 - JSON转对象:反过来,可以使用 `JSONObject.toBean(jsonObject, Class)` 或 `JSONArray....

    json-lib-2.3-jdk15.jar和它的源码包

    2. **与Hibernate集成**:json-lib可以方便地将Hibernate的实体对象转换为JSON,这对于开发基于RESTful API的Web应用非常有用。 3. **自定义转换策略**:可以通过实现`net.sf.json.JSONObject$BeanProcessor`接口...

    java解析json的jar包

    2. **commons-beanutils**:Apache Commons BeanUtils是Apache软件基金会的一个项目,提供了一系列实用工具类,简化了JavaBean的操作。在处理JSON时,BeanUtils可以帮助将JSON对象映射到JavaBean实例,反之亦然。...

    json-2.2.3-jdk13全部包6个

    "json-lib"核心包包含了JSON解析、序列化和反序列化的基本功能,而其他五个依赖包可能是为了提供额外的支持,例如与其他数据格式(如XML、Hibernate对象等)之间的转换,或者提供更高效的解析和生成机制。...

    json依赖的jar包

    Json-lib是一个支持多种Java库的JSON库,如Hibernate和Spring。然而,这个库已经不再活跃维护,因此对于新项目,通常不推荐使用。 5. **Apache JSON**(Apache Commons Lang): Apache提供了一个简单的JSON处理...

    SSh框架所需json jar包

    为了确保SSH项目能正确处理JSON,开发者需要将这些jar包添加到项目的类路径中,通常通过Maven或Gradle等构建工具进行管理。 总之,SSH框架对JSON的支持依赖于特定的jar包,这些jar包提供了JSON解析和生成的功能,...

    json-lib-2.4的jar包.zip

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务和应用程序之间的数据传输,因为它易于读写,且被大多数编程语言支持。JSON库如`json-lib`为开发者提供了处理JSON对象的工具,...

    JAVA后台使用JSON用到的JAR

    虽然不是专门处理JSON的库,但Apache Commons Lang提供了许多有用的工具类,如`StringEscapeUtils`可以用于转义JSON字符串中的特殊字符,这对于JSON格式的处理也很有帮助。 6. **JSON-P (JSR 353) 和 JSON-B (JSR ...

    json-lib方式的包

    这个库在Java社区中特别受欢迎,因为它提供了多种Java对象到JSON的映射方式,包括使用Hibernate、EJB3、JaxB等技术的对象。此外,json-lib还支持XML到JSON和JSON到XML的转换,增强了数据交换的灵活性。 json-lib的...

Global site tag (gtag.js) - Google Analytics