alibaba / alibaba/fastjson2

[QUESTION] 为什么这么慢呢 string 反序列化成java对象 要一秒钟

Open
#3,838 6 comments 0 reactions 0 assignees View on GitHub
question
Dominant language
Java
Stars
4.4k
Forks
613
Avg merge
1d 22h
Merged PRs (30d)
6

Description

### 请描述您的问题
*询问有关本项目的使用和其他方面的相关问题。*

Image

`package com.easyis.apaas.common.form.menu;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;

/**
* 研究 从redis 读取 CustomMenuEntity太慢
*
*/
public class TestFastjson2ParseSlow {
static {
/*System.out.println("执行了"+JSONReader.Feature.AllowUnQuotedFieldNames.mask);
JSON.config(JSONReader.Feature.AllowUnQuotedFieldNames);*/
}

public static void toJSONObject(String str) {
long begin =System.currentTimeMillis();
//转jsonObj
Object v = JSON.parseObject(str);
System.out.println("result:"+v.getClass().getName()+" "+v);
long end =System.currentTimeMillis();
long cost = end - begin;
System.out.println("toJSONObject耗时:"+cost);
}

public static void toJavaObjectAutoType(String str) {
long begin =System.currentTimeMillis();
//转jsonObj
@SuppressWarnings("deprecation")
Object v = JSON.parseObject(str, Object.class,JSONReader.Feature.SupportAutoType);
System.out.println("result:"+v.getClass().getName()+" "+v);
long end =System.currentTimeMillis();
long cost = end - begin;
System.out.println("toJavaObjectAutoType耗时:"+cost);
}
public static void toJavaObject(String str,Class clazz) {
long begin =System.currentTimeMillis();
//转jsonObj
//会报错 can not convert to boolean : java.util.HashMap
//Object v = JSON.parseObject(str, clazz);
Object jsonObj = JSON.parse(str);
Object v = JSON.to(clazz, jsonObj);
System.out.println("result:"+v.getClass().getName()+" "+v);
long end =System.currentTimeMillis();
long cost = end - begin;
System.out.println("toJavaObject耗时:"+cost);

}
public static void main(String[] args) throws Exception {

//JSON.config(JSONReader.Feature.AllowUnQuotedFieldNames);
String str="{\"@type\":\"com.easyis.apaas.common.form.menu.CustomMenuEntity\",\"appId\":\"sapp_dev_platform\",\"bottomOperationButton\":\"[{\\\"enable\\\":true,\\\"functionName\\\":\\\"exportApp\\\",\\\"functionCnName\\\":\\\"导出应用\\\",\\\"functionType\\\":\\\"10\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"customActionSetting\\\":\\\"{ \\\\n \\\\n \\\\\\\"action\\\\\\\":\\\\\\\"serviceFunction\\\\\\\",\\\\n\\\\n \\\\\\\"needSelectedRow\\\\\\\": \\\\\\\"single\\\\\\\",\\\\n \\\\n \\\\\\\"actionType\\\\\\\":\\\\\\\"download\\\\\\\",\\\\n \\\\n \\\\\\\"refreshList\\\\\\\":false,\\\\n \\\\\\\"serviceFunction\\\\\\\":\\\\\\\"${appFormService}.exportApp\\\\\\\"\\\\n\\\\n}\\\\n\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"importApp\\\",\\\"functionCnName\\\":\\\"导入应用\\\",\\\"functionType\\\":\\\"10\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"customActionSetting\\\":\\\"{ \\\\n \\\\n \\\\\\\"action\\\\\\\":\\\\\\\"serviceFunction\\\\\\\",\\\\n\\\\n \\\\\\\"formKey\\\\\\\":\\\\\\\"st_ide_import_export_file\\\\\\\",\\\\n \\\\\\\"formData\\\\\\\":{},\\\\n \\\\n \\\\\\\"needSelectedRow\\\\\\\": \\\\\\\"none\\\\\\\",\\\\n \\\\n \\\\\\\"refreshList\\\\\\\":true,\\\\n \\\\\\\"serviceFunction\\\\\\\":\\\\\\\"${appFormService}.importApp\\\\\\\"\\\\n\\\\n}\\\\n\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchDisabled\\\",\\\"functionCnName\\\":\\\"批量停用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_1\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchEnabled\\\",\\\"functionCnName\\\":\\\"批量启用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"0\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchRecycle\\\",\\\"functionCnName\\\":\\\"批量移动到回收站\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"-1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"}]\",\"createBy\":\"admin\",\"createTime\":\"2024-05-16 17:10:56\",\"customMenuId\":\"1791033582962081792\",\"ds\":\"st_ide_app\",\"keywordQueryFieldsBean\":[{\"camleFieldName\":\"name\",\"field_des_name\":\"null【常规】\",\"field_name\":\"name\",\"field_type\":\"常规\",\"numType\":false,\"orderby\":0}],\"menuCode\":\"sm_1_2\",\"menuIcon\":\"menu-icon fa fa-leaf black\",\"menuName\":\"应用\",\"menuOrder\":\"460\",\"menuType\":1,\"operationButton\":\"[{\\\"enable\\\":true,\\\"functionName\\\":\\\"switchApp\\\",\\\"functionCnName\\\":\\\"切换应用\\\",\\\"functionType\\\":\\\"10\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"customActionSetting\\\":\\\"{ \\\\n \\\\n \\\\\\\"action\\\\\\\":\\\\\\\"serviceFunction\\\\\\\",\\\\n \\\\n \\\\\\\"needSelectedRow\\\\\\\": \\\\\\\"single\\\\\\\",\\\\n\\\\n \\\\\\\"refreshList\\\\\\\":true,\\\\n \\\\\\\"refreshListTimeout\\\\\\\":0,\\\\n \\\\\\\"serviceFunction\\\\\\\":\\\\\\\"${appFormService}.switchApp\\\\\\\"\\\\n\\\\n}\\\",\\\"condition\\\":\\\"TV_1\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"disabled\\\",\\\"functionCnName\\\":\\\"停用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_1\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"enabled\\\",\\\"functionCnName\\\":\\\"启用\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"0\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"recycle\\\",\\\"functionCnName\\\":\\\"移动到回收站\\\",\\\"functionType\\\":\\\"3\\\",\\\"fieldSetting\\\":[{\\\"field_name\\\":\\\"status\\\",\\\"required\\\":\\\"default\\\",\\\"hide\\\":\\\"default\\\",\\\"readonly\\\":\\\"default\\\",\\\"defaultValue\\\":\\\"\\\",\\\"defaultValueExpression\\\":\\\"\\\",\\\"fieldValue\\\":\\\"-1\\\",\\\"fieldValueExpression\\\":\\\"\\\"}],\\\"customActionSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_2\\\"}]\",\"orderFields\":[{\"@type\":\"com.alibaba.fastjson2.JSONObject\",\"field_name\":\"app_id\",\"order\":\"DESC\"}],\"orderbyFieldsBean\":[{\"field\":{\"camleFieldName\":\"appId\",\"field_des_name\":\"null【常规】\",\"field_name\":\"app_id\",\"field_type\":\"常规\",\"numType\":false,\"orderby\":0},\"orderByOrder\":\"DESC\"}],\"pageBtnsEnabledMap\":{\"@type\":\"java.util.HashMap\",\"add\":true,\"batchDel\":true,\"edit\":true,\"del\":true,\"list\":true},\"pageButton\":\"[{\\\"enable\\\":true,\\\"functionName\\\":\\\"list\\\",\\\"functionCnName\\\":\\\"查询\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"add\\\",\\\"functionCnName\\\":\\\"添加\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"edit\\\",\\\"functionCnName\\\":\\\"修改\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_4\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"del\\\",\\\"functionCnName\\\":\\\"删除\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_3\\\"},{\\\"enable\\\":true,\\\"functionName\\\":\\\"batchDel\\\",\\\"functionCnName\\\":\\\"删批量除\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"TV_3\\\"},{\\\"enable\\\":false,\\\"functionName\\\":\\\"batchEdit\\\",\\\"functionCnName\\\":\\\"批量编辑\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":false,\\\"functionName\\\":\\\"importData\\\",\\\"functionCnName\\\":\\\"导入\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"},{\\\"enable\\\":false,\\\"functionName\\\":\\\"exportData\\\",\\\"functionCnName\\\":\\\"导出\\\",\\\"fieldSetting\\\":\\\"\\\",\\\"condition\\\":\\\"\\\"}]\",\"pageButtonEntity\":[{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"查询\",\"functionName\":\"list\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"新增\",\"functionName\":\"add\",\"position\":\"top\"},{\"condition\":\"TV_4\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"修改\",\"functionName\":\"edit\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"删除\",\"functionName\":\"del\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"批量删除\",\"functionName\":\"batchDel\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"批量编辑\",\"functionName\":\"batchEdit\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导入\",\"functionName\":\"importData\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导出\",\"functionName\":\"exportData\",\"position\":\"top\"}],\"pageButtonEntityCach\":[{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"查询\",\"functionName\":\"list\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"新增\",\"functionName\":\"add\",\"position\":\"top\"},{\"condition\":\"TV_4\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"修改\",\"functionName\":\"edit\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"删除\",\"functionName\":\"del\",\"position\":\"row\"},{\"condition\":\"TV_3\",\"defaultBtn\":true,\"enable\":true,\"functionCnName\":\"批量删除\",\"functionName\":\"batchDel\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"批量编辑\",\"functionName\":\"batchEdit\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导入\",\"functionName\":\"importData\",\"position\":\"top\"},{\"condition\":\"\",\"defaultBtn\":true,\"enable\":false,\"functionCnName\":\"导出\",\"functionName\":\"exportData\",\"position\":\"top\"}],\"pageCode\":\"sm_1_2\",\"pageQuerySet\":{\"keyword_query\":\"name\",\"simple_query\":[{\"@type\":\"com.alibaba.fastjson2.JSONObject\",\"field_name\":\"status\",\"operation\":\"=\",\"isBetweenAnd\":false}]},\"quickTagViews\":\"\",\"reportId\":\"\",\"showFieldsBean\":[],\"sysMenuType\":\"3\",\"tabViews\":\"TV_4:全部,TV_3:回收站\",\"tableId\":\"st_ide_app\",\"tenantId\":\"0:sapp_dev_platform\",\"updateBy\":\"admin\",\"updateTime\":\"2024-08-27 02:27:58\"}\r\n";

//转jsonObj 574 627 693 605
//toJSONObject(str);

//转java对象指定class 1050 969 966
for (int i = 0; i < 10; i++) {
new Thread() {
@Override
public void run() {
toJavaObject(str,com.easyis.apaas.common.form.menu.CustomMenuEntity.class);
}
}.start();

}

// 转java对象 935 936 1023 973
//toJavaObjectAutoType(str);


}

}`

Contributor guide

Open the contributing guide

Research direction

Start with the TestFastjson2ParseSlow main method and its toJSONObject, toJavaObjectAutoType, and toJavaObject methods, then run the supplied benchmark with CustomMenuEntity. Compare parsing, conversion, auto-type handling, and the ten concurrent threads separately; done means identifying which stage accounts for the reported delay and documenting a reproducible result.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.