由于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处理方案。
分享到:
相关推荐
JSON Quick Syntax Reference Apress | Software Engineering | 2016 A unique compact reference on JSON JSON is important for today's enterprise and big data web developers Uses popular open source IDEs...
AJAXJSON的实现
Json 技术实现登入注册(实现了数据的累加 无覆盖)
JSON Quick Syntax Reference 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者...
简单实现js省市级联效果->>>>还在等待什么?->>>>javascript和json放在同个页面,方便查看。
Js读取json数据实现滚动分页实例 Js读取json数据实现滚动分页实例 Js读取json数据实现滚动分页实例
json 新方案 请参考 方案 开始看看吧
Js读取json数据实现滚动分页实例,供参考!
使用JSON插件实现JSON类型的Result
html转换为json的实现源码,以及json结构的描述文档;定义了通用的json结构存储各种html表格以及附件;可作为自定义表单实现的参考;
c# 使用Json.NET实现json序列化.docx
对json源码全面分析,详细介绍json功能实现原理
使用json-lib实现json与Java对象的互转
自己实现的Android PHP JSON实现登陆注册功能,使用okhttp3实现
tinyXML Json接口实现 封装了tinyXml和Jxon常用操作另有有测试代码 VS2008测试通过
本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。
php-jsonpatch, PHP的JSON补丁实现 面向PHP的 这是在PHP中编写的 JSON补丁的实现。通过 Composer 安装$ composer require php-jsonpatch/php-jsonpatch用法现在,你可以通过可用的Comp
fusionChart使用json数据实现报表 fusionChart使用json数据实现报表
JavaWeb通过ajax、json实现省市二级联动:客户端通过jsp页面,来访问服务器的servlet,服务器访问数据库,返回json数据给客户端
jsonDB是js的一个类库,是基于json数据格式构建的数据模型实现对json数据增删改查。jsonDB的构建源自于HTML5本地存储的一个应用需求,可以通过sql对json数据进行增删改查,同时该类库提供强大的where检索条件,数据...