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();
}
}
JsonUtils
最新推荐文章于 2024-09-14 16:44:55 发布