关于JSON Reference实现的方案讨论

由于fastjson简单易用,性能卓越,越来越多的用户在使用。很多用户在初次使用时都遇到了循环引用的问题,这是反映最多的问题,我越来越认识到支持循环引用的必要性。

之前fastjson没有加入对循环支持,原因有两个:
1) 对引用处理技术不够了解;
2) 对支持循环引用的性能存在担心。

这两个问题都已经一定程度得到解决,有了技术储备,性能问题也有了解决方案。性能问题的处理在于代码实现细节,不在这里讨论,我希望和大家一起讨论一下引用表示方案。

DOJO很早就发展了自己的Reference实现方案,其开发者Kris Zyp做了很多研究,包括
http://dojotoolkit.org/reference-guide/dojox/json/ref.html,这个文档描述了DOJO支持循环引用的方案,
http://tools.ietf.org/id/draft-zyp-json-schema-03.html,这是Kris Zyp在ietf的提案。
http://json-schema.org/

对引用的处理,其方案基本如下:
{"$ref":"#"} // 自引用
{"$ref":"3"} // id引用

Kris Zyp做的一些研究,对我颇有启发,但是我不喜欢它表示json reference path的方案。处理引用Kris Zyp的方案最重要的是基于id的引用,这会限制范围,对实现的性能也会有影响。

w3c也关注到了json, W3C希望提供JSON+RDF的规范,http://www.w3.org/wiki/JSON+RDF,这个地址收录一些JSON技术方案。

JSON-LD也是值得参考的:http://json-ld.org/spec/latest/。JDSON-LD中有表示类型的fieldName使用@type,我觉得这个不错。

JSONPath,http://goessner.net/articles/JsonPath/。JSONPath类似XPath,我觉得这是表示引用的较好方案,我很欣赏其中的JSONPath expressions的设计,这个在java script中应该很容易实现。

我喜欢的表示方案:
{
"children":[
{
"children":[{
"children":[],
"id":3,
"name":"系统基础",
"parent":{"$ref":".."}, // 引用上一级对象
"root":{"$ref":"$"} // 引用根对象
}],
"id":2,
"name":"平台技术部",
"parent":{"$ref":".."}, // 引用上一级对象
"root":{"$ref":".."} // 引用上一级对象
},
{
"children":[],
"id":4,
"name":"中文站技术部",
"parent":{"$ref":".."}, // 引用上一级对象
"root":{"$ref":".."} // 引用上一级对象
}
],
"id":1,
"name":"技术部",
"root":{"$ref":"@"} // 引用自身
}

通过JSONPath来描述引用,不受对象是否存在key field限制。

DOJO风格的实现:
{
"children":[
{
"children":[{
"children":[],
"id":3,
"name":"系统基础",
"parent":{"$ref":"2"}, // id应用
"root":{"$ref":"1"} // id应用
}],
"id":2,
"name":"平台技术部",
"parent":{"$ref":"3"}, // id应用
"root":{"$ref":"1"} // id应用
},
{
"children":[],
"id":4,
"name":"中文站技术部",
"parent":{"$ref":"1"}, // id应用
"root":{"$ref":"1"} // id应用
}
],
"id":1,
"name":"技术部",
"root":{"$ref":"#"} // 引用自身
}

这种基于id的引用方式,使用范围受到限制,如果对象不存在key field,或者key field不是id,就不适用了。

这是我目前的初步方案,将会在下一次发布的fastjson中实现。

希望大家参与讨论,一起实现最好的json reference处理方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值