锁定老帖子 主题:fastjson发布1.1.3版本
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-29
支持循环引用。 很多用户在初次使用fastjson时都遇到了循环引用的问题,这是反映最多的问题,我越来越认识到支持循环引用的必要性。经过测试,加入循环应用的支持对性能的影响很小,小于5%。我决定在1.1.3加入循环应用支持,而且是缺省打开这个特性。 fastjson支持的循环应用是自然的,不需要象jackson那样,需要Annotation设置。fastjson支持的引用,是基于path的,方便javascript解析。 语法 {"$ref":"$"} // 引用根对象 {"$ref":"$"} // 引用根对象 {"$ref":"@"} // 引用自己 {"$ref":".."} // 引用父对象 {"$ref":"../.."} // 引用父对象的父对象 {"$ref":"$.members[0].reportTo"} // 基于路径的引用 具体例子看这里:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=5832796 自省支持 在标准中,将对象序列化为JSON文本之后,就丢失了类型信息。虽然fastjson能够支持parse时传入Class来实现类型的识别,但是这个有局限性,在fastjson 1.1.3之后,完善支持一个特性,就是自省。 具体例子请看这里:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=5832803 支持非缺省构造函数和工厂方法构造对象 fastjson 1.1.3开始支持没有缺省构造函数的Java对象的反序列化。通过@JSONCreator来标识构造对象的方式。 具体请看这里: * 非缺省构造函数 http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=5832818 * 工厂方法 http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=5832821 原型接口 以接口的方式来操作json数据,这个特性是借鉴了jackson的功能。 具体例子看这里:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=5832824 How to get it? If you're Maven user, just use our maven repository(http://code.alibabatech.com/mvn/releases/) with folloging dependency <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.3</version> </dependency> Downlaods Binary : http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.3/fastjson-1.1.3.jar Source :http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.3/fastjson-1.1.3-sources.jar Subversion : http://code.alibabatech.com/svn/fastjson/trunk/fastjson/ Issue tracking http://code.alibabatech.com/jira/plugins/servlet/project-config/FASTJSON/versions * Bug [FASTJSON-73] - 不支持Set类型数据的反序列 [FASTJSON-77] - JSONSerializerMap存在兼容问题 [FASTJSON-78] - java.util.concurrent.TimeUnit序列化数据不对 * Improvement [FASTJSON-71] - 使用Base64编码优化byte[]字段的序列化和反序列化性能 [FASTJSON-72] - 使用SoftReference处理ThreadLocalCache * New Feature [FASTJSON-74] - 支持序列化时输出类型信息 [FASTJSON-75] - 支持Key类型不是String的Map的序列化和反序列化 [FASTJSON-80] - 原型接口 [FASTJSON-81] - 支持循环引用 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-30
最后修改:2011-08-30
Ext只能显示一个引用的问题,本来应该图片中的“兼营情况”的“所属行业”也要显示“商业”才对的。
JSON代码: { "results" : [{ "id" : "2011083017055107201", "indexName" : "所属集贸市场", "operateIndustry" : { "id" : "2011083017053082401", "industryName" : "商业", "industryType" : 1, "parent" : { "id" : "-1", "industryName" : "经营行业 " }, "taxType" : 1 } }, { "id" : "2011083017060000801", "indexName" : "兼营情况", "operateIndustry" : { "$ref" : "$.results[1].operateIndustry" } }], "totalCount" : 2 } Ext代码: var store = new Ext.data.JsonStore({ url : 'basic/index!list', totalProperty : 'totalCount', root : 'results', remoteSort : true, fields : ['id', 'indexName', 'operateIndustry.industryName', 'remark'] }); var cm = new Ext.grid.ColumnModel({ defaultSortable : true, columns : [new Ext.grid.RowNumberer(),// 显示行号 this.sm, { header : '调查指标', width : 150, dataIndex : 'indexName' }, { header : '所属行业', width : 150, dataIndex : 'operateIndustry.industryName' }, { header : '备注', width : 150, dataIndex : 'remark' }] }); |
|
返回顶楼 | |
发表时间:2011-08-30
最后修改:2011-08-30
这种问题无解 除非json tool 支持一定深度的序列化。譬如,你这个例子深度应该是3。 json tool保证在序列化小于等于此深度的对象,此深度内,不含reference |
|
返回顶楼 | |
发表时间:2011-08-30
在javascript这一端,需要一段javascript处理引用,把fastjson的引用转换伟javascript的对象应用,需要有人帮忙完成这件事情
|
|
返回顶楼 | |
发表时间:2011-08-30
最后修改:2011-08-30
可能我的场景不适合这种引用方式
|
|
返回顶楼 | |
发表时间:2011-08-30
flayfan,你是对的,不是你一个项目或者人碰到这个问题。
JSON 应该还没有标准化 Reference,因此让客户端去根据refernce去转化成javascript对象,会非常不好,会绑定在某一个特定的JSON工具上。而且,EXTJS能做这事情么? 我以前做了一个工具是可以指定一定深度,并对多对一这种情况做数据冗余。满足大部分需要,而又没有增加过多数据量 |
|
返回顶楼 | |
发表时间:2011-08-31
javamonkey 写道 flayfan,你是对的,不是你一个项目或者人碰到这个问题。
JSON 应该还没有标准化 Reference,因此让客户端去根据refernce去转化成javascript对象,会非常不好,会绑定在某一个特定的JSON工具上。而且,EXTJS能做这事情么? 我以前做了一个工具是可以指定一定深度,并对多对一这种情况做数据冗余。满足大部分需要,而又没有增加过多数据量 我也曾经对fastjson提过建议,在多层关联中可以指定引用深度。但目前还没有实现,希望后面会实现吧。 |
|
返回顶楼 | |
发表时间:2011-08-31
我猜fastjson 初衷可能是用来传递数据,并不是用来跟界面交互的。所以希望以后能实现吧
|
|
返回顶楼 | |
发表时间:2011-08-31
这个功能加的有点激进.
一个简单的json又开始被赋予自引用的功能,下一步很可能就是制定jsonPath规范了,再过几天再加入命名空间概念.越来越有xml 的味道了... 我觉得Json的内容就应该只是字面的,不该带有什么引用属性,更别说还有语法了.一个使用了{"$ref":"$.members[0].reportTo"}的json,你怎么和其他解析器或者其他语言交换数据? |
|
返回顶楼 | |
发表时间:2011-08-31
至于 flyfan 那个问题,不要json语法不支持引用,但是可以使用逻辑引用啊.用operateIndustry的id做引用不就行了.
|
|
返回顶楼 | |