一:fastjson JSONArray、字符串转List
- 之前使用的是如下方法:
/** * @since 1.2.23 */ public <T> List<T> toJavaList(Class<T> clazz) { List<T> list = new ArrayList<T>(this.size()); ParserConfig config = ParserConfig.getGlobalInstance(); for (Object item : this) { T classItem = (T) TypeUtils.cast(item, clazz, config); list.add(classItem); } return list; }
-
后来,阿里云上检测到 【漏洞预警】fastjson < 1.2.61 反序列化远程代码执行漏洞
于是,升级了版本到 1.2.8.然后上面那个方法也被删除了。便使用 parseArray 方法
public static <T> List<T> parseArray(String text, Class<T> clazz) {
if (text == null) {
return null;
}
List<T> list;
DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance());
JSONLexer lexer = parser.lexer;
int token = lexer.token();
if (token == JSONToken.NULL) {
lexer.nextToken();
list = null;
} else if (token == JSONToken.EOF && lexer.isBlankInput()) {
list = null;
} else {
list = new ArrayList<T>();
parser.parseArray(clazz, list);
parser.handleResovleTask(list);
}
parser.close();
return list;
}
JSONObject repayPlan = getRepayPlan(); // 具体的业务实现
List<TestBo> list = JSONObject.parseArray(repayPlan.getJSONArray("plan").toJSONString(), TestBo.class);
二.fastjson List 转 JSONArray
List<T> list = new ArrayList<T>();
JSONArray array= JSONArray.parseArray(JSON.toJSONString(list));
public static JSONArray parseArray(String text) {
if (text == null) {
return null;
} else {
DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance());
JSONLexer lexer = parser.getLexer();
JSONArray array;
if (lexer.token() == 8) {
lexer.nextToken();
array = null;
} else if (lexer.token() == 20) {
array = null;
} else {
array = new JSONArray();
parser.parseArray(array);
parser.handleResovleTask(array);
}
parser.close();
return array;
}
}