四种Java常用Json库
JSONObject依赖包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.sf.ezmorph</groupId>
<artifactId>ezmorph</artifactId>
<version>1.0.6</version>
</dependency>
<!-- JSONObject.fromObject()的依赖, JSONArray.fromObject() -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
要想实现JSON和java对象之间的互转,需要借助第三方jar包,这里使用json-lib这个jar包,下载地址为:https://sourceforge.net/projects/json-lib/,json-lib需要commons-beanutils-1.8.0.jar、commons-collections-3.2.1.jar、commons-lang-2.5.jar、commons-logging-1.1.1.jar、ezmorph-1.0.6.jar五个包的支持,可以自行从网上下载
json-lib提供了几个类可以完成此功能,例,JSONObject、JSONArray。从类的名字上可以看出JSONObject转化的应该是对象格式的,而JSONArray转化的则应该是数组对象(即,带[]形式)的。
阿里巴巴fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
工具类
/**
* FastJson 工具类(阿里巴巴)
* @author EraJieZhang
* @data 2018/12/11
*/
public class FastJsonUtil {
/***
* 解析为字符串
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static String fromString(String jsonString, String key) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject.getString(key);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为布尔
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static Boolean formBoolean(String jsonString, String key) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject.getBoolean(key);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为String
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static String formString(String jsonString, String key, String skey) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
JSONObject jsonObject1 = jsonObject.getJSONObject(key);
String jsonObject2 = jsonObject1.getString(skey);
return jsonObject2;
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为Int
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static int formInt(String jsonString, String key, String skey) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
JSONObject jsonObject1 = jsonObject.getJSONObject(key);
int jsonObject2 = jsonObject1.getInteger(skey);
return jsonObject2;
} else {
return -1;
}
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/***
* 解析为数字
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static Integer formInteger(String jsonString, String key) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject.getInteger(key);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为长位十进制数
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static BigDecimal formBigDecimal(String jsonString, String key) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject.getBigDecimal(key);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为双精度
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static Double formDouble(String jsonString, String key) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject.getDouble(key);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为浮点数
*
* @param jsonString json字符串
* @param key 关键字
* @return 返回值
*/
public static Float formFloat(String jsonString, String key) {
try {
if (jsonString != null && jsonString.length() > 0) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
return jsonObject.getFloat(key);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 解析为对象
*
* @param jsonString json字符串
* @param key 需要解析的关键字
* @param t 泛型
* @param <T> 泛型
* @return 返回的对象
*/
public static <T> T fromBean(String jsonString, String key, Class<T> t) {
if (jsonString != null) {
try {
JSONObject jsonObj = JSONObject.parseObject(jsonString);
return JSONObject.toJavaObject(jsonObj.getJSONObject(key), t);
} catch (Exception e) {
return null;
}
} else {
return null;
}
}
/***
* 解析为列表
*
* @param jsonString json字符串
* @param key 需要解析的关键字
* @param t 泛型
* @param <T> 泛型
* @return 返回的列表
*/
public static <T> ArrayList<T> fromList(String jsonString, String key, Class<T> t) {
ArrayList<T> list = new ArrayList<T>();
if (jsonString != null && jsonString.length() > 0) {
try {
JSONObject jsonObj = JSONObject.parseObject(jsonString);
JSONArray inforArray = jsonObj.getJSONArray(key);
for (int index = 0; index < inforArray.size(); index++) {
list.add(JSONObject.toJavaObject(
inforArray.getJSONObject(index), t));
}
} catch (Exception e) {
}
}
return list;
}
/***
* 直接解析为bean
*
* @param jsonString json字符串
* @param t 泛型
* @param <T> 泛型
* @return 返回的bean
*/
public static <T> T fromBean(String jsonString, Class<T> t) {
try {
if (jsonString != null && jsonString.length() > 0) {
return JSON.parseObject(jsonString, t);
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/***
* 直接解析为list
*
* @param jsonString json字符串
* @param t 泛型
* @param <T> 泛型
* @return 返回的泛型数组
*/
public static <T> ArrayList<T> fromList(String jsonString, Class<T> t) {
ArrayList<T> list = null;
try {
list = new ArrayList<>();
if (jsonString != null && jsonString.length() > 0) {
list.addAll(JSON.parseArray(jsonString, t));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/***
* 将列表转换为json
*
* @param listBean 泛型数组
* @return json字符串
*/
public static <T> String ArrayToJson(ArrayList<T> listBean) {
String jsonString = JSON.toJSONString(listBean);
return jsonString;
}
/***
* 将类转为json
*
* @param <T> 泛型
* @return json字符串
*/
public static <T> String BeanToJson(Object obj) {
String jsonsString = JSON.toJSONString(obj);
return jsonsString;
}
}
谷歌GSON
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
<scope>compile</scope>
</dependency>
工具类
import java.util.List;
import java.util.Map;
import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
public class GsonUtil {
/**
* 不用创建对象,直接使用Gson.就可以调用方法
*/
private static Gson gson = null;
private static JsonParser jsonParser = null;
/**
* 判断gson对象是否存在了,不存在则创建对象
*/
static {
if (gson == null) {
//gson = new Gson();
// 当使用GsonBuilder方式时属性为空的时候输出来的json字符串是有键值key的,显示形式是"key":null,而直接new出来的就没有"key":null的
gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
}
if(jsonParser == null ){
jsonParser = new JsonParser();
}
}
private GsonUtil() {}
/**
* json 转对象
* @param strJson
* @return
*/
public static JsonObject string2Object(String strJson) {
return jsonParser.parse(strJson).getAsJsonObject();
}
/**
* 将对象转成json格式
* @param object
* @return String
*/
public static String object2String(Object object) {
String gsonString = null;
if (gson != null) {
gsonString = gson.toJson(object);
}
return gsonString;
}
/**
* 将json转成特定的cls的对象
* @param gsonString
* @param cls
* @return
*/
public static <T> T stringToBean(String gsonString, Class<T> cls) {
T t = null;
if (gson != null) {
//传入json对象和对象类型,将json转成对象
t = gson.fromJson(gsonString, cls);
}
return t;
}
/**
* json字符串转成list
* @param gsonString
* @param cls
* @return
*/
public static <T> List<T> stringToList(String gsonString, Class<T> cls) {
List<T> list = null;
if (gson != null) {
//根据泛型返回解析指定的类型,TypeToken<List<T>>{}.getType()获取返回类型
list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
}.getType());
}
return list;
}
/**
* json字符串转成list中有map的
* @param gsonString
* @return
*/
public static <T> List<Map<String, T>> stringToListMaps(String gsonString) {
List<Map<String, T>> list = null;
if (gson != null) {
list = gson.fromJson(gsonString,
new TypeToken<List<Map<String, T>>>() {
}.getType());
}
return list;
}
/**
* json字符串转成map的
* @param gsonString
* @return
*/
public static <T> Map<String, T> stringToMaps(String gsonString) {
Map<String, T> map = null;
if (gson != null) {
map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
}.getType());
}
return map;
}
public static String jsonElementAsString(JsonElement jsonElement) {
return jsonElement == null ? null : jsonElement.getAsString();
}
public static Integer f jsonElementAsInt(JsonElement jsonElement) {
return jsonElement == null ? null : jsonElement.getAsInt();
}
public static void main(String[] args) {
String s = "{\"goods_id\":\"140861765\",\"cat_id\":\"210\",\"goods_sn\":\"171073501\",\"goods_sn_back\":\"171073501\",\"goods_upc\":null,\"goods_name\":\"Lace-Up Boxer Swimming Trunks\"}";
Map<String, Object> map = stringToMaps(s);
System.out.println(map);
}
}
Jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.1</version>
</dependency>
工具类
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
/**
* Jackson工具类
*/
@Slf4j
public final class JsonUtil {
private static ObjectMapper MAPPER = new ObjectMapper();
// 日起格式化
private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
static {
//对象的所有字段全部列入
MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);
//取消默认转换timestamps形式
MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//忽略空Bean转json的错误
MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
MAPPER.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
//忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
private JsonUtil() {
}
/**
* 对象转Json格式字符串
*
* @param object 对象
* @return Json格式字符串
*/
public static String toJson(Object object) {
if (object == null) {
return null;
}
try {
return object instanceof String ? (String) object : MAPPER.writeValueAsString(object);
} catch (Exception e) {
log.error("method=toJson() is convert error, errorMsg:{}", e.getMessage(), e);
return null;
}
}
/**
* Object TO Json String 字符串输出(输出空字符)
*
* @param object 对象
* @return Json格式字符串
*/
public static String toJsonEmpty(Object object) {
if (object == null) {
return null;
}
try {
MAPPER.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object param, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//设置返回null转为 空字符串""
jsonGenerator.writeString("");
}
});
return MAPPER.writeValueAsString(object);
} catch (Exception e) {
log.error("method=toJsonEmpty() is convert error, errorMsg:{}", e.getMessage(), e);
}
return null;
}
/**
* Json 转为 Jave Bean
*
* @param text json字符串
* @param clazz 对象类型class
* @param <T> 对象类型
* @return 对象类型
*/
public static <T> T fromJSON(String text, Class<T> clazz) {
if (StringUtils.isEmpty(text) || clazz == null) {
return null;
}
try {
return MAPPER.readValue(text, clazz);
} catch (Exception e) {
log.error("method=toBean() is convert error, errorMsg:{}", e.getMessage(), e);
}
return null;
}
/**
* Json 转为 Map
*
* @param text json
* @param <K> key
* @param <V> value
* @return map
*/
public static <K, V> Map<K, V> toMap(String text) {
try {
if (StringUtils.isEmpty(text)) {
return null;
}
return toObject(text, new TypeReference<Map<K, V>>() {
});
} catch (Exception e) {
log.error("method=toMap() is convert error, errorMsg:{}", e.getMessage(), e);
}
return null;
}
/**
* Json 转 List, Class 集合中泛型的类型,非集合本身
*
* @param text json
* @param <T> 对象类型
* @return List
*/
public static <T> List<T> toList(String text) {
if (StringUtils.isEmpty(text)) {
return null;
}
try {
return toObject(text, new TypeReference<List<T>>() {
});
} catch (Exception e) {
log.error("method=toList() is convert error, errorMsg:{}", e.getMessage(), e);
}
return null;
}
/**
* Json 转 Object
*/
/**
* @param text json
* @param typeReference TypeReference
* @param <T> 类型
* @return T
*/
public static <T> T toObject(String text, TypeReference<T> typeReference) {
try {
if (StringUtils.isEmpty(text) || typeReference == null) {
return null;
}
return (T) (typeReference.getType().equals(String.class) ? text : MAPPER.readValue(text, typeReference));
} catch (Exception e) {
log.error("method=toObject() is convert error, errorMsg:{}", e.getMessage(), e);
}
return null;
}
}
org.json
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20190722</version>
</dependency>
工具类
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class JsonUtils {
private static final String TAG = JsonUtils.class.getSimpleName();
/**
* 解析json字符串到实例对象
*
* @param clazz 和JSON对应的类的Class,必须拥有setXxx()函数,其中xxx为属性
* @param json 被解析的JSON字符串
* @return 返回传入的Object对象实例
*/
public static <T> T parseJson2Object(String json, Class<T> clazz) {
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(json);
} catch (JSONException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
return null;
}
return parseJson2Object(clazz, jsonObject);
}
/**
* 解析JSONObject对象到具体类,递归算法
*
* @param clazz 和JSON对应的类的Class,必须拥有setXxx()函数,其中xxx为属性
* @param jsonObject 被解析的JSON对象
* @return 返回传入的Object对象实例
*/
private static <T> T parseJson2Object(Class<T> clazz, JSONObject jsonObject) {
T obj = null;
try {
//获取clazz的实例
obj = clazz.newInstance();
Class tempClass = clazz;
List<Field> fieldList = new ArrayList<>();
while (tempClass != null && !tempClass.getName().toLowerCase().equals("java.lang.object")) {//当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
// Collections.reverse(fieldList);
// 遍历每个属性,如果为基本类型和String则直接赋值,如果为List则得到每个Item添加后再赋值,如果是其它类则得到类的实例后赋值
for (Field field : fieldList) {
try {
// 设置属性可操作
field.setAccessible(true);
// if (field.getName().equals("serialVersionUID")) {
// continue;
// }
FSLogcat.e(TAG, " GenericType = " + field.getGenericType().toString());
// 获取字段类型
Class<?> typeClazz = field.getType();
// 是否基础变量 Boolean,Character,Byte,Short,Integer,Long,Float,Double,Void
if (typeClazz.isPrimitive()) {
if (field.getGenericType().toString().equals("float")) {
Object opt = jsonObject.opt(field.getName());
if (opt instanceof Double) {
setProperty(obj, field, ((Double) opt).floatValue());
} else {
setProperty(obj, field, jsonObject.opt(field.getName()));
}
} else {
setProperty(obj, field, jsonObject.opt(field.getName()));
}
} else {
// 得到类型实例
Object typeObj;
if (typeClazz.isInterface() && typeClazz.getSimpleName().contains("List")) {//Field如果声明为List<T>接口,由于接口的Class对象不能newInstance(),此时需要转化为ArrayList
typeObj = ArrayList.class.newInstance();
} else {
typeObj = typeClazz.newInstance();
}
if (field.getName().equals("testMap")) {
Log.e(TAG, " pause");
}
if (typeObj instanceof Map) {// 是否为Map
try {
// 得到Map的JSONObject
JSONObject object = jsonObject.getJSONObject(field.getName());
// 得到类型的结构,如:java.util.HashMap<com.xxx.xxx>
Type type = field.getGenericType();
ParameterizedType pt = (ParameterizedType) type;
// 获得Map元素键类型
// Class<?> keyClass = (Class<?>) pt.getActualTypeArguments()[0];
// 获得Map元素值类型
Class<?> valueClass = (Class<?>) pt.getActualTypeArguments()[1];
JSONArray names = object.names();
for (int i = 0; i < names.length(); i++) {
try {
// 默认按map值为String进行解析
String key = names.opt(i).toString();
Object value = parseJson2Object(valueClass, object.getJSONObject(key));
((Map<String, Object>) typeObj).put(key, value);
} catch (Exception e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
}
setProperty(obj, field, typeObj);
} catch (Exception e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
} else if (typeObj instanceof List) {// 是否为List
// 得到类型的结构,如:java.util.ArrayList<com.xxx.xxx>
Type type = field.getGenericType();
ParameterizedType pt = (ParameterizedType) type;
// 获得List元素类型
Class<?> dataClass = (Class<?>) pt.getActualTypeArguments()[0];
// 得到List的JSONArray数组
JSONArray jArray = jsonObject.getJSONArray(field.getName());
// 将每个元素的实例类加入到类型的实例中
for (int i = 0; i < jArray.length(); i++) {
//对于数组,递归调用解析子元素
try {
((List<Object>) typeObj).add(parseJson2Object(dataClass, jsonObject.getJSONArray(field.getName()).getJSONObject(i)));
} catch (JSONException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
}
setProperty(obj, field, typeObj);
} else if (typeObj instanceof String) {// 是否为String
setProperty(obj, field, jsonObject.opt(field.getName()));
} else {//是否为其它对象
//递归解析对象
try {
setProperty(obj, field, parseJson2Object(typeClazz, jsonObject.getJSONObject(field.getName())));
} catch (JSONException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
}
}
} catch (JSONException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
} catch (IllegalAccessException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
} catch (InstantiationException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
}
} catch (IllegalAccessException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
} catch (InstantiationException e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
return obj;
}
/**
* 给实例对象的成员变量赋值
*
* @param obj 实例对象
* @param field 要被赋值的成员变量
* @param valueObj 要被赋值的成员变量的值
*/
private static void setProperty(Object obj, Field field, Object valueObj) {
if (valueObj == null) {
return;
}
// // 兼容类继承情况的判断
Class<?> tempClass = obj.getClass();
while (tempClass != null && !tempClass.getName().toLowerCase().equals("java.lang.object")) {//当父类为null的时候说明到达了最上层的父类(Object类).
try {
Method method = tempClass.getDeclaredMethod("set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1), field.getType());
//设置set方法可访问
method.setAccessible(true);
//调用set方法为实例对象的成员变量赋值
method.invoke(obj, valueObj);
break; // 退出循环
} catch (NoSuchMethodException e) {
FSLogcat.e(TAG, "method [set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1) + "] not found");
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
} catch (IllegalArgumentException e) {
FSLogcat.e(TAG, "method [set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1) + "] illegal argument:" + valueObj + "," + e.getMessage());
break; // 退出循环
} catch (IllegalAccessException e) {
FSLogcat.e(TAG, "IllegalAccessException:" + e.getMessage());
break; // 退出循环
} catch (InvocationTargetException e) {
FSLogcat.e(TAG, "IllegalAccessException:" + e.getMessage());
break; // 退出循环
} catch (Exception e) {
FSLogcat.e(TAG, "Exception:" + e.getMessage());
break; // 退出循环
}
}
// 未兼容类继承后对父类私有方法的获取
// try {
// Class<?> clazz = obj.getClass();
// //获取类的setXxx方法,xxx为属性
// // getMethods(),该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的)
// Method method = clazz.getMethod("set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1), field.getType());
// // getDeclaredMethods(),该方法是获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法。
Method method = clazz.getDeclaredMethod("set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1), field.getType());
// //设置set方法可访问
// method.setAccessible(true);
// //调用set方法为实例对象的成员变量赋值
// method.invoke(obj, valueObj);
// } catch (NoSuchMethodException e) {
// FSLogcat.e(TAG, "method [set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1) + "] not found");
// } catch (IllegalArgumentException e) {
// FSLogcat.e(TAG, "method [set" + field.getName().substring(0, 1).toUpperCase(Locale.getDefault()) + field.getName().substring(1) + "] illegal argument:" + valueObj + "," + e.getMessage());
// } catch (IllegalAccessException e) {
// FSLogcat.e(TAG, "IllegalAccessException:" + e.getMessage());
// } catch (InvocationTargetException e) {
// FSLogcat.e(TAG, "IllegalAccessException:" + e.getMessage());
// }
}
/**
* 可以解析自定义的对象、map、List、数组、基本数据类型、String
*
* @param value
* @return
*/
public static String object2JsonString(Object value) {
if (value == null) {
return "null";
}
if (value instanceof Boolean) {
return value.toString();
}
if (value instanceof String) {
return "\"" + escape((String) value) + "\"";
}
if (value instanceof Double) {
if (((Double) value).isInfinite() || ((Double) value).isNaN()) {
// return "null";
return "0";
} else {
return value.toString();
}
}
if (value instanceof Float) {
if (((Float) value).isInfinite() || ((Float) value).isNaN()) {
// return "null";
return "0";
} else {
return value.toString();
}
}
if (value instanceof Number) {
return value.toString();
}
if (value instanceof Map) {
return map2Json((Map) value);
}
if (value instanceof Collection) {
return coll2Json((Collection) value);
}
if (value.getClass().isArray()) {
return array2Json(value);
}
return customObject2Json(value);
}
private static String array2Json(Object array) {
if (null == array) {
return "null";
}
StringBuffer sb = new StringBuffer();
sb.append('[');
// 此处减1是为了下面的 逗号 追加
int len = Array.getLength(array) - 1;
if (len > -1) {
int i;
for (i = 0; i < len; i++) {
sb.append(object2JsonString(Array.get(array, i))).append(",");
}
sb.append(object2JsonString(Array.get(array, i)));
}
sb.append(']');
return sb.toString();
}
private static String coll2Json(Collection coll) {
if (null == coll) {
return "null";
}
StringBuffer sb = new StringBuffer();
sb.append('[');
for (Iterator it = coll.iterator(); it.hasNext(); ) {
sb.append(object2JsonString(it.next()));
if (it.hasNext()) {
sb.append(",");
}
}
sb.append(']');
return sb.toString();
}
private static String customObject2Json(Object obj) {
Class tempClass = obj.getClass();
List<Field> fieldList = new ArrayList<>();
while (tempClass != null && !tempClass.getName().toLowerCase().equals("java.lang.object")) {//当父类为null的时候说明到达了最上层的父类(Object类).
fieldList.addAll(Arrays.asList(tempClass.getDeclaredFields()));
tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
}
Map map = new HashMap();
for (Field f : fieldList) {
if (Modifier.isStatic(f.getModifiers())) {
continue;
}
String name = f.getName();
f.setAccessible(true);
Object value = null;
try {
value = f.get(obj);
} catch (IllegalAccessException e) {
value = null;
FSLogcat.e(TAG, "Exception:" + e.getMessage());
}
map.put(name, value);
}
tempClass = null;
fieldList = null;
return map2Json(map);
// Class type = obj.getClass();
// Field[] fields = type.getDeclaredFields();
// Map map = new HashMap();
// for (Field f : fields) {
// if (Modifier.isStatic(f.getModifiers())) {
// continue;
// }
// String name = f.getName();
// f.setAccessible(true);
// Object value = null;
// try {
// value = f.get(obj);
// } catch (IllegalAccessException e) {
// value = null;
// FSLogcat.e(TAG, "Exception:" + e.getMessage());
// }
// map.put(name, value);
// }
// type = null;
// fields = null;
// return map2Json(map);
}
private static String map2Json(Map map) {
if (null == map) {
return "null";
}
StringBuffer sb = new StringBuffer();
sb.append('{');
for (Iterator it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry entry = (Map.Entry) it.next();
String key = (String) entry.getKey();
if (null == key) {
continue;
}
sb.append('\"');
escape(key, sb);
sb.append('\"').append(':').append(object2JsonString(entry.getValue()));
if (it.hasNext()) {
sb.append(",");
}
}
sb.append('}');
return sb.toString();
}
/**
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
*
* @param s
* @return
*/
private static String escape(String s) {
if (s == null) {
return null;
}
StringBuffer sb = new StringBuffer();
escape(s, sb);
return sb.toString();
}
private static void escape(String s, StringBuffer sb) {
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
switch (ch) {
case '"':
sb.append("\\\"");
break;
case '\\':
sb.append("\\\\");
break;
case '\b':
sb.append("\\b");
break;
case '\f':
sb.append("\\f");
break;
case '\n':
sb.append("\\n");
break;
case '\r':
sb.append("\\r");
break;
case '\t':
sb.append("\\t");
break;
// case '/':
// sb.append("\\/");
// break;
case '/':
sb.append("/");
break;
default:
if ((ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F') || (ch >= '\u2000' && ch <= '\u20FF')) {
String ss = Integer.toHexString(ch);
sb.append("\\u");
for (int k = 0; k < 4 - ss.length(); k++) {
sb.append('0');
}
sb.append(ss.toUpperCase());
} else {
sb.append(ch);
}
}
}
}
}
参考文章:(这些文章会有一些具体的工具类,以及使用方式)https://www.cnblogs.com/one12138/p/11494256.html
https://blog.csdn.net/weixin_39859128/article/details/110613391
https://blog.csdn.net/qing_gee/article/details/104001021
https://cloud.tencent.com/developer/article/1675482
https://blog.csdn.net/qq912098812/article/details/110390557