`
wenshao
  • 浏览: 271370 次
  • 性别: 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  
温少,你太给力了!!!做开源做到你这个份上,真是太佩服了。如果淘宝里都是像你这么有责任心的人,淘宝想不发都难

相关推荐

    使用fastjson实现对象和json串之间的相互转换的jar包

    在标题中提到的"使用fastjson实现对象和json串之间的相互转换的jar包",就是指通过引入Fastjson的jar依赖,开发者可以在项目中直接调用其API来实现这两个功能。 首先,让我们看看如何将Java对象转换为JSON字符串。...

    通过fastjson实现各种格式与json之间的转换

    通过fastjson实现了JavaBean,list,MAP,list等格式与json格式之间的转换,已经附带fastjson的包,包的版本为fastjson-1.1.36.jar

    springMVC整合FastJson实现RestFul风格API

    本文将详细介绍如何在Spring MVC项目中整合FastJson,实现RESTful风格的API。 首先,我们需要在项目中引入Spring MVC和FastJson的相关依赖。在Maven的pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.spring...

    用fastJSON实现安卓手机APP与ASP.NET系统集成研究.pdf

    通过JSON的简洁数据格式和FastJSON的高性能处理,开发者可以轻松地在两端之间传递复杂的数据,实现应用程序的功能扩展和数据交互。在实际工程中,这种集成方法具有广泛的应用前景,尤其是在需要跨平台数据交换的场景...

    以map方式依赖fastjson实现web精简实例

    总结,这个实例通过Map和Fastjson在Java Web应用中实现了前后台数据的高效交换,同时结合jQuery的Ajax功能,使得用户界面与服务器端的数据交互更为流畅。理解并掌握这些技术对于提升Java Web开发能力至关重要。

    阿里fastjson.jar

    在标题中提到的"fastjson.jar"是Fastjson库的主要运行时文件,它包含了所有必要的类和资源,使得开发者能够直接在项目中引用并使用Fastjson的功能。 描述中指出,Fastjson支持大量的JSON数据转换,这意味着它可以...

    fastjson1.2.2.rar

    通过查看源代码,开发者可以深入理解 Fastjson 的内部实现机制,包括其解析策略、性能优化措施,以及如何处理 JSON 格式的各种特例。这对于调试、学习和定制 Fastjson 功能非常有帮助。 **Fastjson 的核心特性** - ...

    springMVC整合FastJson实现RestFul风格API涉及jar包

    在开发Web应用时,Spring MVC框架常用于构建后端服务,而FastJson是阿里巴巴提供的一款高效、功能强大的JSON处理库。本教程将详细介绍如何在Spring MVC项目中整合FastJson,以便实现RESTful风格的API。 首先,理解...

    fastjson-1.2.9.jar.zip

    4. **性能优化**: 阿里巴巴对 Fastjson 进行了深度优化,使其在处理速度上表现出色,尤其在大数据量的 JSON 解析和序列化时。 5. **安全增强**: 针对 JSON 注入等安全问题,Fastjson 提供了安全模式,可以防止恶意...

    fastjson1.2.2.jar

    而Fastjson,由阿里巴巴公司开发,是一款性能优秀且易用的Java语言编写的JSON库,它能够实现Java对象与JSON数据之间的快速转换。本文将围绕Fastjson的核心特性、使用方法以及优化策略展开详细讲解。 一、Fastjson...

    fastjson-1.2.9

    Fastjson是阿里巴巴开发的一款高效、功能强大的JSON库,广泛应用于Java编程环境中。它以其简洁的API、卓越的性能和丰富的功能,成为了许多开发者处理JSON数据的首选工具。在Fastjson-1.2.9版本中,我们主要关注三个...

    fastjson.jar包资源

    4. 支持自定义类型转换:Fastjson允许开发者自定义类型转换规则,通过实现`JSONSerializer`和`JSONParser`接口,可以对特定类型的字段进行特殊处理。 5. JSONPath支持:Fastjson提供了对JSONPath的支持,这使得在...

    fastjson-1.2.66_fastjson-1.2.66.jar_Fastjson_

    Fastjson 1.2.66是该库的一个稳定版本,其核心功能包括JSON字符串与Java对象之间的转换,以及JSON数据的解析与生成。本文将深入探讨Fastjson 1.2.66版本中的关键特性和使用技巧。 1. **JSON字符串与Java对象的转换*...

    fastjson的jar包 绿色版

    1. **快速的解析与生成**:Fastjson采用了优化的算法,使得在处理大规模JSON数据时仍能保持高速度。 2. **强大的映射机制**:它可以自动将JSON数据映射为Java对象,反之亦然,无需额外的注解或配置。 3. **类型安全*...

    fastjson-1.2.5

    《深入解析Fastjson:从1.2.4到1.2.5的演进与优化》 Fastjson,由阿里巴巴开发并开源的一款高效、功能强大的Java JSON库,它以其轻量级、快速以及对Java对象和JSON数据之间的无缝转换而闻名。在本文中,我们将深入...

    fastjson.jar包

    - 文件列表中的`fastjson-1.2.2.jar`是Fastjson的1.2.2版本,该版本可能包含了bug修复、性能优化和新功能。 - `fastjson-1.2.2-sources.jar`包含了源代码,方便开发者查看和学习内部实现。 - `fastjson-1.2.2.zip...

    fastjson-master源码

    Fastjson的核心功能是将Java对象转换为JSON字符串,以及将JSON字符串反序列化为Java对象。它提供了一种简单直观的API,使得JSON操作变得轻而易举。例如,`JSON.toJSONString(obj)`用于将Java对象转换成JSON字符串,...

    fastjson-1.2.83.jar下载

    fastjson的主要功能有: 1. 速度快:fastjson采用内置的字符解析算法,超过同类其他解析库速度。 2. 支持普通JSON和JavaScript JSON标准:fastjson支持所有JSON标准语法,同时支持JavaScript混入的语法,如 NaN、Infinity...

    fastjson定制工程,别名配置化

    在“jxxt-fastjson”这个压缩包中,可能包含了实现这个功能的源代码、配置文件示例、以及相关的测试用例。通过分析这些内容,我们可以深入理解如何在实际项目中实施这个定制的Fastjson别名配置化方案。同时,了解这...

Global site tag (gtag.js) - Google Analytics