这些都是常见的数据结构事实上大部分现代计算机语言都以某种形式支持它们这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能,当JSON转化为XML时,还有一些细节需要注意,这些细节,很多开源的XML转JSON代码里面都没有应用到,我推荐的XML 转换JSON格式的时候额外遵循的规则:
- <root>
- <node1>node1_value</node1>
- <node2>node2_value</node2>
- <root>
- 转化后:
- var jsonObj = {
- root : {
- 'node1' : {
- '$' : 'node1_value'
- }, //当然,这里也可以为 $ : 'node1_value',但是推荐Dic名字加入引号的方式
- 'node2' : {
- '$' : 'node2_value'
- }
- }
- }
- 2 XML Attribute,应该作为"$"字符开头的,“子集合,值”的方式转化,例如:
- <root root_att1="root_att1_value" root_att2="root_att2_value">
- <node1 node1_att1="node1_att1_value" node1_att2="node1_att2_value">node1_value</node1>
- <node2 node2_att1="node2_att1_value" node2_att2="node2_att2_value">node2_value</node2>
- </root>
- 转化后:
- var jsonObj = {
- root : {
- '$root_att1' : 'root_att1_value',
- '$root_att2' : 'root_att2_value',
- 'node1' : {
- '$' : 'node1_value',
- '$node1_att1' : 'node1_att1_value',
- '$node1_att2' : 'node1_att2_value'
- },
- 'node2' : {
- '$' : 'node2_value',
- '$node2_att1' : 'node2_att1_value',
- '$node2_att2' : 'node2_att2_value'
- }
- }
- }
大家可以看到,转换过程中频繁使用到字符"$",这一点很关键,因为如果Attribute也采用和Child Element相同的方式转化,那么将产生子元素的歧义,后果是,一旦发生XML -> JSON转化,将不可能准确的进行此操作的逆过程,即生成的JSON无法转化为之前的XML。
此这里使用XML Element和XML Attribute中都不可能出现,而JSON转化中允许的"$"字符,标识XML Attribute(熟悉JS著名类库Prototype的朋友,对这个字符应该很熟悉 :)),让XML和JSON互相转化的过程完全可逆。#t#
当然,本文没有提到XML Namespace和XML其它特殊元素,如<!DOCTYPE>,<!ENTITY>标签。原因是,我认为希望转换为JSON的XML应该事先由XMLDOM做处理,简化并规避转化过程中可能出现的很多特殊的因素,以便让XML -> JSON转化过程专注于数据格式本身,而更加通俗顺畅;因此,这些因素可以认为不在本文讨论的格式转化范围内。