本文介绍一个Json解析的框架,此框架支持把Bean或者嵌套实体类或者List< Bean >转成Json字符串。代码下载
文章目录
1 调用示例
下面是模拟数据的生成,然后把数据转成json格式。
public static void format() {
List<News> newsList = new ArrayList<>();
News news = new News();
news.setId(1);
news.setTitle("乌克兰美女嫁给东北小伙!");
news.setContent("今日,从沈阳日报了解到。一个东北屌丝。。。。。。");
news.setAuthor(createAuthor());
news.setReader(createReaders());
System.out.println(FastJson.toJson(news));
}
private static List<User> createReaders() {
List<User> readers = new ArrayList<User>();
User readerA = new User();
readerA.setId(2);
readerA.setName("Kobe");
readers.add(readerA);
User readerB = new User();
readerB.setId(1);
readerB.setName("James");
readers.add(readerB);
return readers;
}
private static User createAuthor() {
User author = new User();
author.setId(1);
author.setName("Haden");
author.setPwd("123456");
return author;
}
public static void main(String[] args) {
format();
}
上面代码是构造生成一个News类。News类包括标题,内容,看过的人,和作者。具体类这里就贴出来了。因为主要说的是json解析的过程。下面是News类转成Json后对应的内容
可以看到,只是通过System.out.println(FastJson.toJson(news));
中的FastJson.toJson(news)
就可以实现把实体类转成json。
2 代码实现
2.1 解析入口 toJson(Object object)方法
当把实体类转成json时,只需要把实体类传到此方法中,就可以转成对应的json字符串。同时支持集合。
/**
* 此方法会将一个对象转换成json字符串
*
* @param object 将要被转成json字符串的对象
* @return json字符串
*/
public static String toJson(Object object) {
//JSON载体
StringBuffer jsonBuffer = new StringBuffer();
//判断是否是集合类型
if (object instanceof List<?>) {
jsonBuffer.append("[");
List<?> list = (List<?>) object;
//循环读取集合类型
for (int i = 0; i < list.size(); i++) {
addObjectToJson(jsonBuffer, list.get(i));
//jsonArray添加 逗号分隔
if (i < list.size() - 1) {
jsonBuffer.append(",");
}
}
jsonBuffer.append("]");
} else {
addObjectToJson(jsonBuffer, object);
}
return jsonBuffer.toString();
}
该方法首先会判断需要解析的实体类是否是集合类型,如果不是直接调用2.2方法。解析该实体类。
如果是集合类型,那么就遍历这个集合,然后在调用2.1的方法。并在调用前和调用后添加“[”和“]”。
其实这里的解析主线就是把实体类中的属性值对应的名字和值封装到StringBuffer上。最后再把这个组装好的StringBuffer返回。
2.2 addObjectToJson(StringBuffer jsonBuffer, Object object)
/**
* 解析单独的JSONobject类型
* 递归
*
* @param jsonBuffer
* @param object
*/
private static void addObjectToJson(StringBuffer jsonBuffer, Object object) {
jsonBuffer.append("{"); //{
List<Field> fields = new ArrayList<>();
getAllFields(object.getClass(), fields);
for (int i = 0; i < fields.size(); i++) {
Method method = null;
//1 获取field
Field field = fields.get(i);
Object fieldVlaue = null;
String fieldName = field.getName();
String methodName = "get" + ((char) (fieldName.charAt(0) - 32) + fieldName.substring(1));
try {
//2 获取到Method对象
method = object.getClass().getMethod(methodName);
} catch (NoSuchMethodException e1) {
if (!fieldName.startsWith("is")) {
methodName = "is" + ((char) (fieldName.charAt(0) - 32) + fieldName.substring(1));
}
try {
method = object.getClass().getMethod(methodName);
} catch (NoSuchMethodException e2) {
replaceChar(i, fields, jsonBuffer);
continue;
}
}
if (method != null) {
try {
//3 通过get方法获取成员变量的值
fieldVlaue = method.invoke(object);
} catch (Exception e) {
replaceChar(i, fields, jsonBuffer);
continue;
}
}
if (fieldVlaue != null) {
jsonBuffer.append("\""); //{"
jsonBuffer.append(fieldName); //{"name
jsonBuffer.append("\":"); //{"name":
if (fieldVlaue instanceof Integer || fieldVlaue instanceof Double ||
fieldVlaue instanceof Long || fieldVlaue instanceof Boolean) {
jsonBuffer.append(fieldVlaue.toString());// {"name":1
} else if (fieldVlaue instanceof String) {
jsonBuffer.append("\"");
jsonBuffer.append(fieldVlaue.toString());// {"name":"张三"
jsonBuffer.append("\"");
} else if (fieldVlaue instanceof List<?>) {
addListToBuffer(jsonBuffer, fieldVlaue);
} else if (fieldVlaue instanceof Map) {
//TODO
} else {
addObjectToJson(jsonBuffer, fieldVlaue);
}
jsonBuffer.append(","); // {"name":"张三",
}
if (i == fields.size() - 1 && jsonBuffer.charAt(jsonBuffer.length() - 1) == ',') {
jsonBuffer.deleteCharAt(jsonBuffer.length() - 1);
}
}
jsonBuffer.append("}"); //{"name":"张三",}
}
- 这个方法比较长,也是该类的核心。因为该类解析的是实体类,所以在开始和结尾处分别给StringBuffer加“{”和“}”。
- 然后通过
getAllFields(Class<?> aClass, List<Field> fields)
方法获得所有成员变量。通过这些成员变量来获取成员变量的名字和值。这里的成员变量的值是通过拼接处的get…方法来反射访问对象的值, - 在解析的过程中,如果遇到集合。那么将会调用
addListToBuffer(StringBuffer jsonBuffer, Object fieldValue)
方法来给解析集合对象。在此方法中会在解析前后分别给StringBuffer加“[”和“]”。
然后递归解析集合中的实体类。
/**
* 获取当前类中的所有的成员变量
*
* @param aClass 成员变量所在的类
* @param fields aClass中所有的成员变量
*/
private static void getAllFields(Class<?> aClass, List<Field> fields) {
if (fields == null) {
fields = new ArrayList<>();
}
//排除Object类型
if (aClass.getSuperclass() != null) {
//获取到当前class的所有成员变量的Field
Field[] fieldSelf = aClass.getDeclaredFields();
for (Field field : fieldSelf) {
//排除当前Class的所有成员变量的Field
if (!Modifier.isFinal(field.getModifiers())) {
fields.add(field);
}
}
//获取到父类的所有成员变量
getAllFields(aClass.getSuperclass(), fields);
}
}
/**
* 当Json字符串中包含集合时
*
* @param jsonBuffer
* @param fieldValue
*/
private static void addListToBuffer(StringBuffer jsonBuffer, Object fieldValue) {
List<?> list = (List<?>) fieldValue;
jsonBuffer.append("[");
for (int i = 0; i < list.size(); i++) {
addObjectToJson(jsonBuffer, list.get(i));
if (i < list.size() - 1) {
jsonBuffer.append(",");
}
}
jsonBuffer.append("]");
}