将 JavaBean 封装成 JSON 格式的字符串
封装 JSON 数据的代码片段
List listUser = new ArrayList<>(); //创建一个List集合
Map mapUser = new HashMap<>(); //创建一个Map集合
mapUser.put("map-key", new UserBean(4, "map-1", 10, 2.456789, null,null, null)); //添加一个map的元素
listUser.add(new UserBean(3, "list-1", 17, 1.456, null, null, null));//添加一个list的元素
UserBean[] arrayUser = { new UserBean(2, "array-1", 16, 10.0123456,null, null, null) }; //创建一个对象数组并添加一个元素
UserBean us = new UserBean(1, "大白", 18, 3.230, listUser, mapUser,arrayUser); //将list map 对象数组 都设置到JavaBean当中
Pson pson = Pson.Instance(); //初始化工具类
/**
* 使用工具进行封装JavaBean中的所有字段
*/
String jsonStr = pson.objectToJson(us);
System.out.println(jsonStr);
/**
* 使用工具进行封装JavaBean中的ID 与名字
*/
jsonStr = pson.objectToJson(us,"id","name");
System.out.println(jsonStr);
封装 JSON 格式后的数据
//封装所有的字段
{"id":1,"name":"大白","age":18,"money":3.23,"listUser":[{"id":3,"name":"list-1","age":17,"money":1.456}],"mapUser":{"map-key":{"id":4,"name":"map-1","age":10,"money":2.456789}},"arrayUser":[{"id":2,"name":"array-1","age":16,"money":10.0123456}]}
//封装指定的字段
{"id":1,"name":"大白"}
将 JSON 格式字符串解析成 Object 实体类
首先准备两个 JSON 格式的数据 一个为对象 一个为数组
JSON-1: String jsonStr = {"id":1,"name":"大白","age":18,"money":1.0453}
JSON-2: String jsonArray = [{"id":1,"name":"大白","age":18,"money":2.0453},{"id":1,"name":"大白","age":18,"money":1.0453}]
解析对象
Pson pson = Pson.Instance();
/**
* 调用工具类进行解析 一参为被解析的类的class对象 二参为JSON格式的字符串数据
*/
UserBean ub = pson.jsonToObject(UserBean.class, jsonStr);
System.out.println(ub);
//解析完毕后打印的ub对象
UserBean [id=1, name=大白, age=18, money=1.0453, listUser=null, mapUser=null, arrayUser=null]
解析数组
UserBean users[] = {}; // 首先先初始化一个空的数组
users = pson.jsonToObject(users.getClass(), jsonArray);
for (UserBean u : users) {
System.out.println(u);
}
//解析完毕后打印的数组元素
UserBean [id=1, name=大白1, age=18, money=1.0453, listUser=null, mapUser=null, arrayUser=null]
UserBean [id=2, name=大白2, age=18, money=2.0453, listUser=null, mapUser=null, arrayUser=null]
JSON 工具类
使用工具类前需要有原生 org.json 包 前往下载
之前因为不太喜欢第三方的东西 虽然知道有 Gson 这类的第三方工具
所以自己动手写了一个工具
public class Pson {
private String pattern = "yyyy-MM-dd HH:mm:ss";//时间格式
public void setPattern(String pattern) {
this.pattern = pattern;
}
public static final Pson pson = new Pson();
public static Pson Instance() {
return pson;
}
private Pson() {
}
/**
* 将对象 转换成JSON格式的字符串
*
* @param object 需要封装的对象
* @param fieldName 需要封装的指定字段 如果为空 则封装所有字段
* @return 返回封装后的JSON格式的字符串
*/
public Object objectToJson(Object object, String... fieldName) {
return ObjectToString(object, fieldName);
}
/**
* 将对象 转换成JSON格式的字符串
*
* @param object
* @param fieldName 需要封装指定的字段
* @return 接收到之后 调用toString即可
*/
private Object ObjectToString(Object object, String... fieldName) {
if (object == null) {
return null;
} else if (object instanceof List) { // 判断是否是List集合
List list = (List) object;
JSONArray array = new JSONArray();
if (list.size() != 0) {
Object oneObject = list.get(0);// 先取出第一个元素 然后判断是否是基本数据类型
// 或者String类型
if (toBasicData(oneObject)) { // 元素是基本数据类型
for (Object element : list) {
array.put(element);
}
} else {
for (Object element : list) {
array.put(ObjectToString(element, fieldName));
}
}
}
return array;
} else if (object.getClass().isArray()) {
Object oArray[] = (Object[]) object;
JSONArray jsonArray = new JSONArray();
/**
* 判断数组长度
*/
if (oArray.length != 0) {
if (toBasicData(oArray[0])) { // 判断数组的元素是基本数据 还是对象
for (Object elementObject : oArray) {
jsonArray.put(elementObject);
}
} else {
for (Object elementObject : oArray) {
jsonArray.put(ObjectToString(elementObject, fieldName));
}
}
}
return jsonArray;
} else if (object instanceof Map) {
Map map = (Map) object;
Set> entries = map.entrySet();
JSONObject jsonObject = new JSONObject();
if (fieldName.length != 0) {//判断是否需要解析指定的字段
for (String keyName :
fieldName) {
jsonPutMap(jsonObject, keyName, map.get(keyName), fieldName);
}
} else {
/**
* 遍历MAP集合
*/
for (Map.Entry entry : entries) {
jsonPutMap(jsonObject, entry.getKey(), entry.getValue(), fieldName);
}
}
return jsonObject;
} else if (object instanceof Date) { //时间类
return new SimpleDateFormat(pattern).format((Date) object);
}
JSONObject json = new JSONObject();
Class c = object.getClass();
Field fs[] = null;
if (fieldName != null && fieldName.length != 0) { // 判断是否需要 取出指定的字段
int len = fieldName.length;
fs = new Field[len];
int i = 0;
for (String s : fieldName) {
try {
fs[i] = c.getDeclaredField(s);
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
i++;
}
} else {
fs = c.getDeclaredFields();
}
for (Field f : fs) {
if (f == null)
continue;
f.setAccessible(true);
try {
Object o = f.get(object);
if (o != null) { // 判断属性内容是否为空
if (toBasicData(o)) { // 判断是否是基本数据类型 或者是String类型
json.put(f.getName(), o);
} else { // 可能是一个JavaBean 或者是集合
json.put(f.getName(), ObjectToString(o, fieldName));
}
} else {
json.put(f.getName(), o);
}
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
return json;
}
/**
* 判断是否是字符串 或者是 基本数据类型
*
* @param object
* @return 基本数据类型|字符串类型 返回true
*/
private boolean toBasicData(Object object) {
if (object == null) {
return false;
} else if (object instanceof String || object instanceof Integer || object instanceof Boolean
|| object instanceof Character || object instanceof Byte || object instanceof Short
|| object instanceof Long || object instanceof Float || object instanceof Double) {
return true;
}
return false;
}
/**
* 判断是否是字符串 或者是 基本数据类型
*
* @param oc
* @return 基本数据类型|字符串类型 返回true
*/
private boolean toBasicData(Class oc) {
if (oc.isPrimitive() || oc.isAssignableFrom(String.class) || oc.isAssignableFrom(Integer.class)
|| oc.isAssignableFrom(Boolean.class) || oc.isAssignableFrom(Character.class)
|| oc.isAssignableFrom(Byte.class) || oc.isAssignableFrom(Short.class)
|| oc.isAssignableFrom(Long.class) || oc.isAssignableFrom(Float.class)
|| oc.isAssignableFrom(Double.class)) {
return true;
}
return false;
}
/**
* 将JSON转JavaBean对象实例
*
* @param oClass JavaBean的Class对象
* @param jsonStr JSON对象
* @param
* @return
*/
public T jsonToObject(Class oClass, String jsonStr) {
T objectData = null;
try {
if (oClass.isArray()) {// 该class为数组的时候
JSONArray array = new JSONArray(jsonStr);
int len = array.length();
// 获取到数组元素的class
Class ComponentType = oClass.getComponentType();
Object createArray = Array.newInstance(ComponentType, array.length());// 创建一个与JSON数组长度相同的数组
if (toBasicData(ComponentType.newInstance())) { // 进行判断是否是基本数据类型或字符串类型
for (int i = 0; i < len; i++) {
Array.set(createArray, i, array.get(i));
}
} else {
for (int i = 0; i < len; i++) {
Array.set(createArray, i, jsonToObject(ComponentType, array.get(i).toString()));
}
}
objectData = (T) createArray;
} else if (oClass.isAssignableFrom(Date.class)) {//时间类型
Date parse = new SimpleDateFormat(pattern).parse(jsonStr);
objectData = (T) parse;
} else {// 如果不是数组的话 则默认以JavaBean的形式进行解析
objectData = (T) oClass.newInstance(); // 创建该class的对象的实例
JSONObject json = new JSONObject(jsonStr);
Field[] fields = oClass.getDeclaredFields();// 获取到所有的属性
for (Field fs : fields) {// 开始遍历属性
fs.setAccessible(true);
Class cl = fs.getType(); // 取出该属性代表的class
String fieldName = fs.getName(); // 取出该属性的名称
/**
* 判断该属性名字在json中不为空
*/
if (!json.isNull(fieldName)) {
String jsonData = json.get(fieldName).toString();
/**
* 判断 属性字段是否是数组类型
*/
if (cl.isArray()) {
fs.set(objectData, analyticArray(cl, jsonData));
} else if (toBasicData(cl)) { // 基本数据类型
fs.set(objectData, json.get(fieldName));
} else if (cl.isInterface()) { // 接口
Object oj = analyticInterface(cl, (ParameterizedType) fs.getGenericType(), jsonData);
fs.set(objectData, oj);
} else if (cl.isAssignableFrom(ArrayList.class)) { // 判断该成员属性是否为ArrayList集合
Object oj = analyticInterface(List.class, (ParameterizedType) fs.getGenericType(),
jsonData);
fs.set(objectData, oj);
} else if (cl.isAssignableFrom(HashMap.class)) { // 判断该成员属性是否为HashMap集合
Object oj = analyticInterface(Map.class, (ParameterizedType) fs.getGenericType(), jsonData);
fs.set(objectData, oj);
} else { // 如果以上条件都没有成立 则当对象来解析
fs.set(objectData, jsonToObject(cl, jsonData));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return objectData;
}
/**
* 解析数组数据
*
* @param arrayClass 数组的class对象
* @param jsonStr Json格式的字符串数据
* @return
*/
private Object analyticArray(Class arrayClass, String jsonStr) {
try {
// 首先 先获取到数组的子元素的类型class
Class componentType = arrayClass.getComponentType();
// 判断子元素类型 是否是基本类型 或者是String类型
boolean is = toBasicData(componentType.newInstance());
JSONArray jsonArray = new JSONArray(jsonStr);
int len = jsonArray.length();
/**
* 创建一个与该数组类型一至 长度与JSONArray长度一致的数组
*/
Object elementObject = Array.newInstance(componentType, len);
if (is) {
for (int i = 0; i < len; i++) {
Array.set(elementObject, i, jsonArray.get(i));
}
} else { // 如果不是基本数据类型的话 则调用解析对象的方法
for (int i = 0; i < len; i++) {
Array.set(elementObject, i, jsonToObject(componentType, jsonArray.getString(i)));
}
}
return elementObject;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解析成员属性为接口的方法 只支持Map List 集合接口 其他的 均返回null
*
* @param interfaceClass 接口Class对象
* @param jsonStr JSON格式的文本
* @param parameterizedType 泛型的管理
* @return 返回解析后的实例
*/
private Object analyticInterface(Class interfaceClass, ParameterizedType parameterizedType, String jsonStr) {
Object breakObject = null;
try {
if (interfaceClass.isAssignableFrom(List.class)) { // List集合
JSONArray array = new JSONArray(jsonStr);
int len = array.length();
Class c = (Class) parameterizedType.getActualTypeArguments()[0];// 获取到List集合的泛型
List list = new ArrayList<>();
if (toBasicData(c)) {// 判断List的泛型是否为String 或基本类型
for (int i = 0; i < len; i++) {
list.add(array.get(i));
}
} else {// 调用解析对象方法
for (int i = 0; i < len; i++) {
list.add(jsonToObject(c, array.getString(i)));
}
}
breakObject = list;
} else if (interfaceClass.isAssignableFrom(Map.class)) {
/**
* 如果是map集合的话 是会有两个泛型的 对应的为 key value
*/
Class k = (Class) parameterizedType.getActualTypeArguments()[0];
Class v = (Class) parameterizedType.getActualTypeArguments()[1];
if (!k.isAssignableFrom(String.class)) {
throw new ClassCastException("key 请用String类型");
} else {
Map map = new HashMap<>();
JSONObject json = new JSONObject(jsonStr);
Iterator iterator = json.keys();
if (toBasicData(v)) {// 判断value是否为基本类型或String类型
while (iterator.hasNext()) {
String key = iterator.next();
map.put(key, json.get(key));
}
} else {
while (iterator.hasNext()) {
String key = iterator.next();
map.put(key, jsonToObject(v, json.getString(key)));
}
}
breakObject = map;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return breakObject;
}
/**
* JSON put map的key values
*
* @param jsonObject
* @param key
* @param values
* @param fieldName
*/
private void jsonPutMap(JSONObject jsonObject, String key, Object values, String... fieldName) {
try {
if (toBasicData(values)) {// 判断是否是基本数据类型
jsonObject.put(key, values);
} else {
jsonObject.put(key, ObjectToString(values, fieldName));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于