目前json已经成为了非常常用的数据交换格式,不管你是开发钉钉应用、微信应用、还是企业级的应用,关于json的解析与序列化操作无处不在,为了方便操作,通常会把基本的解析与序列化操作进行封装。
说明:
本类需要依赖org.json包中的类,org.json的源码已分享,下载地址:https://download.csdn.net/download/zlbdmm/12363370
package com.mesnac.util;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* 处理json字符串的工具类
*
* @author 郑立兵
*
*/
public class JSONHelper {
/**
* 把Json对象转换位实体类的对象
* @param jsonObj
* json对象
* @param clazz
* 要转换实体类的类型信息
* @return 返回对应的实体对象
*/
public static <T> T jsonObjToEntity(JSONObject jsonObj, Class<T> clazz) {
try {
T entity = clazz.newInstance();
String[] names = jsonObj.getNames(jsonObj);
Map<String, String> map = new HashMap<String, String>();
for (String name : names) {
map.put(name, name);
}
Method[] methods = clazz.getDeclaredMethods();
for (Method m : methods) {
if (m.getName().startsWith("set")) {
String key = m.getName().substring(3).toLowerCase();
if (map.containsKey(key)) {
Object value = jsonObj.get(key);
m.invoke(entity, value);
}
}
}
return entity;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
/**
* 把Json字符串转换位实体类的对象
*
* @param jsonStr
* json格式字符串
* @param clazz
* 要转换实体类的类型信息
* @return 返回对应的实体对象
*/
public static <T> T jsonToEntity(String jsonStr, Class<T> clazz) {
JSONObject jsonObj = new JSONObject(jsonStr);
return jsonObjToEntity(jsonObj, clazz);
}
/**
* 把Json字符串转换位实体类的集合
*
* @param jsonArrStr
* json格式字符串(数组)
* @param clazz
* 要转换集合元素的类型信息
* @return 返回对应的实体集合
*/
public static <T> List<T> jsonArrToList(String jsonArrStr, Class<T> clazz) {
try {
List<T> lst = new ArrayList<T>();
JSONArray jsonObjArr = new JSONArray(jsonArrStr);
for (int i = 0; i < jsonObjArr.length(); i++) {
T entity = jsonObjToEntity(jsonObjArr.getJSONObject(i), clazz);
lst.add(entity);
}
return lst;
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
/**
* 将json字符串转换为List集合
*
* @param jsonArrStr
* @return
*/
public static List<Map<String, Object>> jsonObjList(String jsonArrStr) {
List<Map<String, Object>> jsonList = new ArrayList<Map<String, Object>>();
JSONArray jsonArr = null;
try {
jsonArr = new JSONArray(jsonArrStr);
jsonList = (List<Map<String, Object>>) JSONHelper
.jsonToList(jsonArr);
} catch (JSONException e) {
System.out.println("Json字符串转换异常!");
e.printStackTrace();
}
return jsonList;
}
/**
* 将json对象的键值存放在集合,映射table的column
*
* @param map
* @return
*/
public static List<String> jsonMapKeysList(Map<?, ?> map) {
List<String> jsonjsonList = new ArrayList<String>();
String columnStr = "column";
for (int i = 0; i < map.keySet().size(); i++) {
jsonjsonList.add(columnStr + (i + 1));
}
System.out.println(jsonjsonList.size());
return jsonjsonList;
}
/**
* 将传递进来的json数组转换为List集合
*
* @param jsonArr
* @return
* @throws JSONException
*/
private static List<?> jsonToList(JSONArray jsonArr) throws JSONException {
List<Object> jsonToMapList = new ArrayList<Object>();
for (int i = 0; i < jsonArr.length(); i++) {
Object object = jsonArr.get(i);
if (object instanceof JSONArray) {
jsonToMapList.add(JSONHelper.jsonToList((JSONArray) object));
} else if (object instanceof JSONObject) {
jsonToMapList.add(JSONHelper.jsonToMap((JSONObject) object));
} else {
jsonToMapList.add(object);
}
}
return jsonToMapList;
}
/**
* 将传递进来的json对象转换为Map集合
*
* @param jsonObj
* @return
* @throws JSONException
*/
@SuppressWarnings("unchecked")
private static Map<String, Object> jsonToMap(JSONObject jsonObj)
throws JSONException {
Map<String, Object> jsonMap = new HashMap<String, Object>();
Iterator<String> jsonKeys = jsonObj.keys();
while (jsonKeys.hasNext()) {
String jsonKey = jsonKeys.next();
Object jsonValObj = jsonObj.get(jsonKey);
if (jsonValObj instanceof JSONArray) {
jsonMap.put(jsonKey,
JSONHelper.jsonToList((JSONArray) jsonValObj));
} else if (jsonValObj instanceof JSONObject) {
jsonMap.put(jsonKey,
JSONHelper.jsonToMap((JSONObject) jsonValObj));
} else {
jsonMap.put(jsonKey, jsonValObj);
}
}
return jsonMap;
}
}