`
wenshao
  • 浏览: 271660 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

fastjson实现自省功能优化

阅读更多
JSON标准是不支持自省的,也就是说如下的JSON文本,你不知道它是什么类型:
{"id":12,"name":"魏嘉留"}


fastjson支持传入类型信息,例如:

String text = ...; // {"id":12,"name":"魏嘉留"}
JSON.parseObject(text, Employee.class);


如果序列化时,使用WriteClassName的特性,JSON文本是这样:
Employee x = ...;
String text = JSON.toJSONString(x, SerializerFeature.WriteClassName);

上面例子中的JSON文本是:
{“@type”:"com.alibaba.demo.Employee", "id":12,"name":"魏嘉留"}


带有@type属性的文本将会被自动识别类型,上面的文本可以这样处理:
Employee x = (Employee) JSON.parse(text);


这就是Fastjson支持的自省功能。

但是使用WriteClassName之后,json文本的大小增加了许多,这个怎么办呢?fastjson 1.1.6版本将会做优化处理,非必要,不输出类型信息。
class A {
B getB();
setB(B b);
}


类A拥有属性B,A和B都是对象,但是反序列化的时候,能够根据Property的类型信息得到B的类型,这时只需要输出A的类型,不需要输出B的类型信息。

例如:
{"@type":"com.alibaba.json.demo.A","b":{"id":0}}


在1.1.5之前的版本则会如下:
{"@type":"com.alibaba.json.demo.A","b":{"@type":"com.alibaba.json.demo.B","id":0}}


通过这种办法可以用List<T>类型的属性,由此能够减少冗余不必要的类型信息。

如下是一些测试用例:
http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/writeClassName/WriteClassNameTest2.java

http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/com/alibaba/json/test/bvt/writeClassName/WriteClassNameTest_List2.java 
分享到:
评论
6 楼 robinfoxnan 2011-10-30  
TO runfriends :
我猜,那些\t之间可能是空值,或者什么的,
\t用来占位,
如果缺少了,就会错误,

仅仅猜测而已。

路过。
5 楼 aochant 2011-10-18  
我想拍一砖,这两天拜读了sql parser,没注释,文档就几行测试代码,
只能看源码,源码写得很漂亮,鄙人实在不才 ,看得很吃力
这开源开得也太没诚意了,起码写写实现思路啥的吧 亲
4 楼 runfriends 2011-10-09  
温少:
为什么下述用fastjson序列化的json串不能用firefox自带JSON解析器反序列化成js对象
fastjson序列化结果:[{"accessFlag":"1","desc":"用户定位\r\n\r\nZBP_PER_SEARCH_CONDITION \r\n个人信息搜索\r\n \r\nImport S-CONDITION NAME BIRTHDAY\r\n \r\nExport T-SEARCHRES T-RETURN","endClassname":"com.hiaward.xbankmibs.bpm.service.accountIgt.action.BPSearchEndAction","escnname":"用户定位\n\n ZBP_PER_SEARCH_CONDITION \n 个人信息搜索\n \n Import S-CONDITION NAME BIRTHDAY\n \n Export T-SEARCHRES T-RETURN","exceptionflag":0,"id":269,"isParent":true,"journalflag":0,"projectid":1,"remoteAccessType":"1","remoteAccessUrl":"","routerId":"0000000001","serviceHandlerType":"0","servicename":"ES-EX-SearchClientInfoHead-T","servicenum":"ES-EX-SearchClientInfoHead-T","startClassname":"com.hiaward.xbankmibs.bpm.service.accountIgt.action.SearchClientStartAction","type":1,"uptime":1316669923890,"version":""}]
jackson序列化结果
{
        "id": 269,
        "type": 1,
        "domain": null,
        "version": "",
        "servicename": "ES-EX-SearchClientInfoHead-T",
        "servicenum": "ES-EX-SearchClientInfoHead-T",
        "escnname": "用户定位\n\n\t\t\tZBP_PER_SEARCH_CONDITION \n\t\t\t个人信息搜索\n\t\t\t\n\t\t\tImport S-CONDITION NAME BIRTHDAY\n\t\t\t\n\t\t\tExport T-SEARCHRES T-RETURN",
       
        "projectid": 1,
        "prodesc": null,
        "developer": null,
        "journalflag": 0,
        "routerId": "0000000001",
        "serviceCategory": null,
        "desc": "用户定位\r\n\r\nZBP_PER_SEARCH_CONDITION \r\n个人信息搜索\r\n\t\t\t\r\nImport S-CONDITION NAME BIRTHDAY\r\n\t\t\t\r\nExport T-SEARCHRES T-RETURN",
        "desc": "用户定位\r\n\r\nZBP_PER_SEARCH_CONDITION \r\n个人信息搜索\r\n \r\nImport S-CONDITION NAME BIRTHDAY\r\n \r\nExport T-SEARCHRES T-RETURN"
        "accessFlag": "1",
        "remoteAccessType": "1",
        "remoteAccessUrl": "",
        "serviceHandlerType": "0",
        "asname": null,
        "endClassname": "com.hiaward.xbankmibs.bpm.service.accountIgt.action.BPSearchEndAction",
        "startClassname": "com.hiaward.xbankmibs.bpm.service.accountIgt.action.SearchClientStartAction",
        "cpcflag": null,
        "exceptionflag": 0,
        "uptime": 1316669923890,
        "usableflag": null,
        "wipeoff": null,
        "refedByProdesc": null,
        "isParent": true,
        "trTemplate": null
    }
我在firefox使用 JSON.parse()解析上述json串时出错
错误内容是:SyntaxError: JSON.parse: bad control character in string literal
而我用jackson就不会出错。
两个库的惟一不同在于原java对象的属性值,连贯的\t在fastjson都被序列化成了一个空格,而jackson没有针对\t做这样的处理。
请温少指教。
为什么fastjson要针对\t做这样的处理?另外我实在找不到firefox JSON不能反序列化上述fastjson生成的json串的原因。
3 楼 wenshao 2011-10-08  
回复 littleJava,List<Class>反序列化的BUG已经修正。http://code.alibabatech.com/jira/browse/FASTJSON-104
2 楼 littleJava 2011-09-30  
fastjson 不支持 List<Class> 类型的数据吗?

根据官网的示例:
http://119.38.217.15/wiki/display/FastJSON/JavaBean+to+JSONString
public class Group {
    private Long id;
    private String name;
    private List<User> users = new ArrayList<User>();
    private List<Class> clzes = new ArrayList<Class>();
    /** setter && getter **/
}


新增属性 clzes
序列化成功,反序列化失败
    public void serialize() {
        Group group = new Group();
        group.setId(0L);
        group.setName("admin");
        User guestUser = new User();
        guestUser.setId(2L);
        guestUser.setName("guest");
        User rootUser = new User();
        rootUser.setId(3L);
        rootUser.setName("root");
        group.getUsers().add(guestUser);
        group.getUsers().add(rootUser);
        group.getClzes().add(Integer.class);
        group.getClzes().add(int.class);
        String jsonString = JSON.toJSONString(group);
        System.out.println(jsonString);
        Group group2 = JSON.parseObject(jsonString, Group.class); 
}

代码在生产 group2 提示
com.alibaba.fastjson.JSONException: not support type : null
	at com.alibaba.fastjson.parser.deserializer.DefaultObjectDeserializer.deserialze(DefaultObjectDeserializer.java:246)
	at Fastjson_ASM_Group_1.deserialze(Unknown Source)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:377)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:198)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:158)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:273)
	at org.netease.socketio.util.FastjsonTest.serialize(FastjsonTest.java:50)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
1 楼 wuku 2011-09-26  
温少,你太给力了!!!做开源做到你这个份上,真是太佩服了。如果淘宝里都是像你这么有责任心的人,淘宝想不发都难

相关推荐

    Java系统源码+科研工作量管理系统

    Java系统源码+科研工作量管理系统 内容概要: 本资源包含了完整的Java前后端源码及说明文档,适用于想要快速搭建并部署Java Web应用程序的开发者、学习者。 技术栈: 后端:Java生态系统,包含Spring Boot、Shiro、MyBatis等,数据库使用Mysql 前端:Vue、Bootstrap、Jquery等 适用场景示例: 1、毕业生希望快速启动一个新的Java Web应用程序。 2、团队寻找一个稳定的模板来加速产品开发周期。 3、教育机构或个人学习者用于教学目的或自学练习。 4、创业公司需要一个可以立即投入使用的MVP(最小可行产品)。

    毕业设计-智能优化之粒子群模型Python代码.rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测(含完整的程序,GUI设计和代码详解)

    内容概要:本文介绍了如何在MATLAB中实现结合黏菌优化算法(SMA)和核极限学习机(KELM)的分类预测模型。SMA优化KELM的超参数,提高模型的训练效率和预测精度,特别适用于处理复杂、高维数据集。文档详细阐述了项目背景、目标、挑战、模型架构、代码实现、结果展示、GUI设计、部署与应用等多个方面。 适合人群:具备一定MATLAB编程基础,对机器学习特别是优化算法和核方法感兴趣的科研人员和工程师。 使用场景及目标:①金融预测:股票价格、外汇市场等时间序列预测;②医疗诊断:疾病预测与辅助诊断;③工业故障检测:设备故障预警;④气象预测:天气变化预测;⑤市场营销:客户行为分析与预测。通过结合SMA和KELM,提升模型在高维数据上的分类和预测性能。 其他说明:文档不仅提供了详细的理论和方法介绍,还包含了完整的程序代码和GUI设计,有助于读者快速上手并应用到实际问题中。此外,文档还讨论了模型的部署、安全性和未来改进方向。

    Java jdbc for sqlserver2000 驱动包: msbase.jar;mssqlserver.jar;msutil.jar

    解压到项目下的LIB目录,在IDEA上右键,选添加为库即可。 连接代码如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQL { public static void main(String[] args) { String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; String connectionUrl = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名"; String username = "sa"; String password = "口令"; try { Class.forNam……

    毕业设计-神经网络图像分类代码(可直接运行).rar

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、本项目仅用作交流学习参考,请切勿用于商业用途。

    水母检测4-YOLO(v5至v9)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar

    水母检测4-YOLO(v5至v9)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar水族馆-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括638张图像。 水族馆以可可格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    电缆损坏检测8-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar

    电缆损坏检测8-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar电缆损坏-V2释放 ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 它包括1318张图像。 电缆破坏以可可格式注释。 将以下预处理应用于每个图像: 没有应用图像增强技术。

    基于java的讯友网络相册.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    2024税务稽查典型案例分析(PPT格式,可编辑)

    2024年以来,税务稽查主要针对虚开骗税、骗取税收优惠、隐匿收入、虚增成本等行为,开展重点行业重点领域重点行为税收监管。本课程从案例出发,梳理稽查重点关注的问题行为,分析常见涉税疑点,供财务人员实务参考。

    content_1734090857469.docx

    content_1734090857469.docx

    阵列信号处理-MUSIC算法-幅相误差校正-协方差矩阵校正法-信噪比变化

    阵列信号处理,MUSIC算法中,使用基于协方差矩阵的幅相误差校正法实现幅相误差校正

    linux的概要介绍与分析

    以下是一个关于Linux系统管理与自动化脚本项目的资源描述及源码概要: 资源描述 本项目专注于Linux系统管理与自动化脚本开发,旨在通过一系列脚本提升系统运维效率。在资源准备阶段,我们深入研究了Linux系统架构、Shell脚本编程、以及常用系统管理命令。参考了《Linux命令行与Shell脚本编程大全》等经典书籍,以及Linux官方文档和在线社区,如Stack Overflow和Linux Academy,这些资源为我们提供了丰富的知识和实战案例。 项目实施过程中,我们利用Bash Shell作为主要脚本语言,结合sed、awk、grep等文本处理工具,以及cron作业调度器,实现了系统监控、日志分析、自动备份、用户管理等一系列自动化任务。同时,通过SSH和rsync等工具,实现了远程服务器管理和文件同步,极大地提高了运维的灵活性和效率。 项目源码概要 项目源码包含多个Shell脚本文件,每个脚本负责不同的自动化任务: system_monitor.sh:监控系统资源使用情况,如CPU、内存、磁盘空间等,并生成报告。 log_analyzer.sh:分析系统日志文件,提取关

    黑鲨4S完好机备份基带qcn 黑鲨4S基带qcn

    资源说明; 完好机备份的基带qcn文件 下载后解压 可以解决常规更新降级刷第三方导致的基带丢失。 会使用有需要的友友下载,不会使用的请不要下载 需要开端口才可以写入,不会开端口的请不要下载 希望我的资源可以为你带来帮助 谢谢 参考: https://blog.csdn.net/u011283906/article/details/124720894?spm=1001.2014.3001.5502

    javaweb学生信息管理系统-lw.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    情侣恋爱主题源码LikeGirl v5.2.0最终版

    情侣恋爱主题源码LikeGirlv5.2.0最终版,经过多次更新和优化,情侣小站现已正式定版为v5.2.0。从今日起,此版本将成为项目的最终版本。 维护终止:自2024年11月7日起,情侣小站将不再接受新的功能更新或bug 修复。 用户责任:如在使用过程中遇到任何问题,请自行修复或选择放弃使用。

    基于java进销存管理系统.zip

    项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧!

    园区监控方案【范本模板】.pdf

    园区监控方案【范本模板】.pdf

    基于ssm的房源管理系统源代码(java+vue+mysql+说明文档+LW).zip

    基于ssm的房源管理系统源代码(java+vue+mysql+说明文档+LW).zip

    商务大楼能源计量系统施工方法.docx

    商务大楼能源计量系统施工方法.docx

Global site tag (gtag.js) - Google Analytics