论坛首页 Java企业应用论坛

fastjson发布1.1.3版本

浏览 7311 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-29  
Fastjson 1.1.3是一个重要的功能增强版本,在这个版本开始,fastjson支持循环引用,完善支持WriteClassName的特性,使得fastjson开始具备替换hessian和java serialize的能力。


支持循环引用。

很多用户在初次使用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] - 支持循环引用
   发表时间: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'
			}]
		});




  • 大小: 2.8 KB
0 请登录后投票
   发表时间:2011-08-30   最后修改:2011-08-30

这种问题无解
除非json tool 支持一定深度的序列化。譬如,你这个例子深度应该是3。
json tool保证在序列化小于等于此深度的对象,此深度内,不含reference
0 请登录后投票
   发表时间:2011-08-30  
在javascript这一端,需要一段javascript处理引用,把fastjson的引用转换伟javascript的对象应用,需要有人帮忙完成这件事情
0 请登录后投票
   发表时间:2011-08-30   最后修改:2011-08-30
可能我的场景不适合这种引用方式
0 请登录后投票
   发表时间:2011-08-30  
flayfan,你是对的,不是你一个项目或者人碰到这个问题。

JSON 应该还没有标准化 Reference,因此让客户端去根据refernce去转化成javascript对象,会非常不好,会绑定在某一个特定的JSON工具上。而且,EXTJS能做这事情么?

我以前做了一个工具是可以指定一定深度,并对多对一这种情况做数据冗余。满足大部分需要,而又没有增加过多数据量




0 请登录后投票
   发表时间:2011-08-31  
javamonkey 写道
flayfan,你是对的,不是你一个项目或者人碰到这个问题。

JSON 应该还没有标准化 Reference,因此让客户端去根据refernce去转化成javascript对象,会非常不好,会绑定在某一个特定的JSON工具上。而且,EXTJS能做这事情么?

我以前做了一个工具是可以指定一定深度,并对多对一这种情况做数据冗余。满足大部分需要,而又没有增加过多数据量



我也曾经对fastjson提过建议,在多层关联中可以指定引用深度。但目前还没有实现,希望后面会实现吧。
0 请登录后投票
   发表时间:2011-08-31  
我猜fastjson 初衷可能是用来传递数据,并不是用来跟界面交互的。所以希望以后能实现吧
0 请登录后投票
   发表时间:2011-08-31  
这个功能加的有点激进.
一个简单的json又开始被赋予自引用的功能,下一步很可能就是制定jsonPath规范了,再过几天再加入命名空间概念.越来越有xml 的味道了...

我觉得Json的内容就应该只是字面的,不该带有什么引用属性,更别说还有语法了.一个使用了{"$ref":"$.members[0].reportTo"}的json,你怎么和其他解析器或者其他语言交换数据?
0 请登录后投票
   发表时间:2011-08-31  
至于 flyfan 那个问题,不要json语法不支持引用,但是可以使用逻辑引用啊.用operateIndustry的id做引用不就行了.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics