`
wenshao
  • 浏览: 271392 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

关于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处理方案。
分享到:
评论
1 楼 gohsy 2013-08-02  
hi,我也是你的fastjson重度用户。
大概看都是表示法的区别,
事实上,这样含有$ref的json串,在js上并不是很好处理,如果基于字符表示法分析和回溯,那在浏览器上就不会有很好的响应体验了。
个人感觉,使用全路径xpath形式还能利于js处理。
或者,你有什么更好的方案?

相关推荐

    MySQL 8.0 Reference Manual.pdf

    MySQL 8.0 Reference Manual是一个全面的文档,它提供了关于MySQL 8.0版本的详细信息,包括其安装、配置、使用和维护等各个方面的知识。这份手册不仅适用于当前版本的用户,也包括了对即将发布版本的特性的预先介绍...

    The.Web.Programmers.Desk.Reference

    对于Web服务和API的开发,可能会讨论RESTful架构原则、JSON数据交换格式以及OAuth认证机制。 最后,Web安全是不容忽视的部分,可能会讲解如何防止SQL注入、XSS攻击、CSRF攻击,以及如何进行安全的会话管理。此外,...

    dubbo第四节1

    4. **泛化调用 - 救急方案**:在无法获取接口类的情况下,Dubbo 提供了泛化调用,允许通过 JSON 字符串直接调用服务,提供了一种灵活的应急解决方案。 接着,我们深入了解了 Dubbo 的初始化过程: 1. **...

    Silverlight 3 Programmers Reference Aug 2009

    《Silverlight 3 程序员参考》是一本由 Infragistics 的开发专家编写的关于 Silverlight 3 的专业教程书籍。该书深入浅出地介绍了 Silverlight 3 在实际项目中的应用方法与技巧,并对开发者在开发过程中可能遇到的...

    iOS开发大厂面试经历

    同时,他们也会看重候选人的解决问题能力和团队协作经验,可能会讨论一些实际项目中的困难和解决方案。 每个公司的面试都会有所不同,但共通点在于,面试官期望找到的是能够解决复杂问题、具备良好技术基础、并且能...

    PHP实例开发源码—Dokeos 开源网上教育和课程管理系统.zip

    理解这些教育技术概念,如SCORM(Sharable Content Object Reference Model)标准,将有助于更好地利用和定制Dokeos。 十、文档与社区支持 Dokeos拥有详细的文档和活跃的社区,用户可以在其中寻找帮助、分享经验。...

    digitalocean-dyn-dns

    本文将深入探讨DigitalOcean的DNS动态更新服务,并结合Rust编程语言,讨论如何实现一个自定义的动态DNS客户端。 一、DigitalOcean DNS服务详解 1. DigitalOcean DNS管理:DigitalOcean的DNS管理系统允许用户轻松地...

    apache-solr-ref-guide-7.1.pdf

    “JSON Request API”部分讲述了使用JSON格式发送请求的API,这是Solr支持的几种请求格式之一。 “Faceting”部分介绍了如何在搜索结果中使用切面(facets),切面是用户界面中常用的导航工具。 “Highlighting”...

    ios面试题目

    3. **内存管理**:在iOS中,了解ARC(Automatic Reference Counting)和强引用循环是非常重要的。理解何时对象被释放,如何避免内存泄漏,以及如何使用弱引用和无主引用是必备技能。 4. **多线程**:gcd(Grand ...

    ios-swift-objc-问题和答案:iOS(swift,objc)。

    这份资源可能还包含了关于Swift和Objective-C最新特性的讨论,比如Swift的版本更新、Swift Package Manager、Catalyst(使iOS应用能运行在macOS上)以及Objective-C的Category和Extension的使用等。 总之,"ios-...

    单点登录源码

    SpringMVC | MVC框架 | [http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc) ...

Global site tag (gtag.js) - Google Analytics