JsonUtils

public class JsonUtils
{
    /**
     * Simple JsonString to obj.
     *
     * @param jsonString
     * @param c
     * @return
     */
    public static Object simpleJsonToObject(String jsonString, Class<?> c)
    {
        try
        {
            JSONObject obj = new JSONObject(jsonString);
            return toObject(obj, c);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * JsonString to obj.
     *
     * @param jsonString
     * @param c
     * @return instance of c and values in string.
     */
    public static Object toObject(String jsonString, Class<?> c)
    {
        try
        {
            JSONObject obj = new JSONObject(jsonString);
            return toObject(obj.getJSONObject(c.getSimpleName()), c);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;

        }

    }

    /**
     *
     * the topName maybe not same with the class c's simple name.
     *
     * @param jsonString
     * @param c
     *            假如是数组就传Example[].class 否则传Example.class 返回的Object是 c的实例
     * @param topName
     *            最外层的key.
     * @return c's new instance.
     */
    public static Object toObject(String jsonString, Class<?> c, String topName)
    {
        try
        {
            if (null == jsonString || jsonString.length() == 0)
            {
                return null;
            }
            JSONObject obj = new JSONObject(jsonString);
            if (c.isArray())
            {
                // array's class name -> [L*******;
                return toObjectArray(obj.optJSONArray(topName), Class.forName(c
                        .getName().substring(2, c.getName().length() - 1)));
            }
            else
            {
                return toObject(obj.optJSONObject(topName), c);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;

        }
    }

    /**
     *
     * obj to JsonString.
     *
     * @param obj
     * @return the jsonString of this obj.
     */
    public static String toJsonString(Object obj)
    {
        return toJsonString(obj, obj.getClass().getSimpleName());
    }

    /**
     *
     * obj to JsonString.
     *
     * @param obj
     * @return the jsonString of this obj.
     */
    public static String toJsonString(Object obj, String topString)
    {
        JSONObject jobj = new JSONObject();
        try
        {
            jobj.putOpt(topString, toJson(obj));
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
        return jobj.toString();
    }

    private static Object[] toObjectArray(JSONArray array, Class<?> c)
    {
        try
        {
            if (array != null && array.length() > 0)
            {
                Object[] objArray = (Object[]) Array.newInstance(c, array
                        .length());
                for (int i = 0; i < array.length(); i++)
                {
                    if ((array.get(i) instanceof String)
                            || (array.get(i) instanceof Long)
                            || (array.get(i) instanceof Double)
                            || (array.get(i) instanceof Boolean))
                    {

                        objArray[i] = array.get(i);
                    }
                    else
                    {
                        if (objArray == null)
                        {
                            objArray = new Object[array.length()];
                        }
                        Object innerObj = toObject(array.getJSONObject(i), c);

                        if (innerObj != null)
                        {
                            objArray[i] = innerObj;
                        }
                    }
                }
                return objArray;
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }

    public static Object toObject(JSONObject jobj, Class<?> c)
    {
        if (c == null || jobj == null)
        {
            return null;
        }
        try
        {
            Object obj = c.newInstance();
            Field[] fields = c.getFields();
            for (Field f : fields)
            {
                String className = f.getType().getName();
                if (className.equals("int")
                        || className.equals(Integer.class.getName()))
                {
                    f.setInt(obj, jobj.optInt(f.getName()));
                }
                else if (className.equals("long")
                        || className.equals(Long.class.getName()))
                {
                    f.setLong(obj, jobj.optLong(f.getName()));
                }
                else if (className.equals("double")
                        || className.equals(Double.class.getName()))
                {
                    f.setDouble(obj, jobj.optDouble(f.getName()));
                }
                else if (className.equals("boolean")
                        || className.equals(Boolean.class.getName()))
                {
                    f.setBoolean(obj, jobj.optBoolean(f.getName()));
                }
                else if (className.equals(String.class.getName()))
                {
                    String s = jobj.optString(f.getName());
                    if (!TextUtils.isEmpty(s))
                    {
                        f.set(obj, s);
                    }
                }
                else if (className.startsWith("[L"))// boolean isArray.
                {
                    JSONArray array = jobj.optJSONArray(f.getName());
                    if (array != null && array.length() > 0)
                    {
                        Class<?> innerClass = Class.forName(className
                                .substring(2, className.length() - 1));
                        Object[] objArray = (Object[]) Array.newInstance(
                                innerClass, array.length());
                        for (int i = 0; i < array.length(); i++)
                        {
                            if ((array.get(i) instanceof String)
                                    || (array.get(i) instanceof Long)
                                    || (array.get(i) instanceof Double)
                                    || (array.get(i) instanceof Boolean))
                            {

                                objArray[i] = array.get(i);
                            }
                            else
                            {
                                if (objArray == null)
                                {
                                    objArray = new Object[array.length()];
                                }
                                Object innerObj = toObject(array
                                        .getJSONObject(i), innerClass);

                                if (innerObj != null)
                                {
                                    objArray[i] = innerObj;
                                }
                            }
                        }
                        f.set(obj, objArray);
                    }
                }
                else
                {
                    JSONObject json = jobj.optJSONObject(f.getName());
                    if (json != null)
                    {
                        Object innerObj = toObject(json, Class.forName(f
                                .getType().getName()));
                        if (innerObj != null)
                        {
                            f.set(obj, innerObj);
                        }
                    }

                }
            }
            return obj;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * obj to JsonObj.
     *
     * @param obj
     *            input obj.
     * @return if obj is array return JsonArray else JsonObject.
     */
    public static Object toJson(Object obj)
    {
        if (obj == null)
        {
            return null;
        }
        try
        {
            if (obj.getClass().isArray())
            {
                JSONArray jArray = null;
                if (((Object[]) obj).length > 0)
                {
                    jArray = new JSONArray();
                    for (int i = 0; i < ((Object[]) obj).length; i++)
                    {
                        if (((Object[]) obj)[i] != null)
                        {
                            Class<?> c = obj.getClass();
                            if (c == int[].class || c == Integer[].class)
                            {
                                jArray.put(((Integer[]) obj)[i]);
                            }
                            else if (c == long[].class || c == Long[].class)
                            {
                                jArray.put(((Long[]) obj)[i]);
                            }
                            else if (c == boolean[].class
                                    || c == Boolean[].class)
                            {
                                jArray.put(((Boolean[]) obj)[i]);
                            }
                            else if (c == double[].class || c == Double[].class)
                            {
                                jArray.put(((Double[]) obj)[i]);
                            }
                            else if (c == String[].class)
                            {
                                jArray.put(((String[]) obj)[i]);
                            }
                            else
                            {
                                jArray.put(toJson(((Object[]) obj)[i]));
                            }
                        }
                    }
                }
                return jArray;
            }
            JSONObject jobj = new JSONObject();
            Field[] f = obj.getClass().getFields();
            for (Field field : f)
            {
                Object inner = field.get(obj);
                if (inner == null)
                {
                    continue;
                }
                Class<?> c = inner.getClass();
                if (c == int.class || c == Integer.class)
                {
                    jobj.putOpt(field.getName(), inner);
                }
                else if (c == long.class || c == Long.class)
                {
                    jobj.putOpt(c.getSimpleName(), inner);
                }
                else if (c == String.class)
                {
                    if (!"".equals(inner))
                    {
                        jobj.putOpt(field.getName(), inner);
                    }
                }
                else
                {
                    jobj.putOpt(field.getName(), toJson(inner));
                }
            }
            return jobj;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
   
    /**
     * InputStream转jsonarray
     * @param is
     * @return
     */
    public static String stream2jarray(InputStream is) {
//        if (is != null) {
//            StringBuffer sb = new StringBuffer();
//            byte[] b = new byte[4096];
//            try {
//                for(int n;(n=is.read(b))!=-1;){
//                    sb.append(new String(b,0,n));
//                }
//                is.close();
//                if(sb.charAt(0) == '{'){
//                    return "["+sb.toString()+"]";
//                }
//                else{
//                    return sb.toString();
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//        return "";
//    }
        StringBuffer buffer = new StringBuffer();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String tempStr = null;
        try
        {
            while ((tempStr = br.readLine()) != null)
            {
                buffer.append(tempStr);
            }
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return buffer.toString();
       
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值