最近在搞go语言编程,涉及到把数据结构序列化为json,然后想总结下json和xml
1.简单介绍下json
json:是javascript object Notation
json类似于xml,,JSON 比 XML 更小、更快,更易解析。
json的语法大致如下 数据使用 名/值 对表示
名字固定用字符串表示,放在""内
json的值,可以是 数字,字符串,逻辑值,数组,对象
json中使用大括号保存对象
使用方括号保存数组,
名/值对之间使用 逗号分割
使用json表示一个数据
一般情况下 json表示数据的时候最外面是个{ },代表描述的是一个整体对象,也可以不是,是[ ]是数组,其他的没有见过。
现在有这样的一个场景,一个汽车销售公司,想要把他们销售的各种汽车汇总下,包括汽车的生产公司,汽车名字,汽车销售价格。就可以用json表示如下,这个称为json方式1:
{"cars":[{"company":"德国大众","name":"奥迪","price":"1600"},
{"company":"美国通用汽车","name":"雪弗兰","price":"1800"}]
}
当然也可以简化下,直接这样这个称为json方式2
[
{"company":"德国大众","name":"奥迪","price":"1600"},
{"company":"美国通用汽车","name":"雪弗兰","price":"1800"}
]
但是这样感觉稍稍有点不太清楚。
2.简单的介绍下xml
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML必须有根标签
XML 文档形成一种树结构
XML 文档必须包含根元素。该元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
所有元素均可拥有子元素:
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。
所有元素均可拥有文本内容和属性(类似 HTML 中)。
同样的上面json中表示的例子,我们现在用xml表示下:
<cars>
<car>
<company>德国大众</company>
<name>奥迪</name>
<price>1600</price>
</car>
<car>
<company>美国通用汽车</company>
<name>雪弗兰</name>
<price>1800</price>
</car>
</cars>
这个能看出来,xml表示的会更大,但是结构相对json更好阅读些。
3.json和xml的转化 有个在线转化工具,大家参考https://www.sojson.com/json2xml/
我只想说下转化后的注意事项,否则感觉有时候想不太清楚。
举个例子:
<cars>
<car>
<company>德国大众</company>
<name>奥迪</name>
<price>1600</price>
</car>
<car>
<company>美国通用汽车</company>
<name>雪弗兰</name>
<price>1800</price>
</car>
</cars>
我把这个输入到转化工具中,那么会转化出我上面说的两种中的哪个呢,感觉应该是比较简单的那个json方式2
转化结果如下:确实按照我们的json方式2进行转化的
[
{
"company": "德国大众",
"name": "奥迪",
"price": "1600"
},
{
"company": "美国通用汽车",
"name": "雪弗兰",
"price": "1800"
}
]
那反过来如果我们把json转化成xml呢,我们把上面这个json转化成xml会是怎样的呢
<?xml version="1.0" encoding="UTF-8"?>
<a>
<e class="object">
<company type="string">德国大众</company>
<name type="string">奥迪</name>
<price type="string">1600</price>
</e>
<e class="object">
<company type="string">美国通用汽车</company>
<name type="string">雪弗兰</name>
<price type="string">1800</price>
</e>
</a>
因为xml的语法必须有根标签,所以他添加了一个根标签<a></a>
我们再把json方式1转化成xml看会是什么样呢
<?xml version="1.0" encoding="UTF-8"?>
<o>
<cars class="array">
<e class="object">
<company type="string">德国大众</company>
<name type="string">奥迪</name>
<price type="string">1600</price>
</e>
<e class="object">
<company type="string">美国通用汽车</company>
<name type="string">雪弗兰</name>
<price type="string">1800</price>
</e>
</cars>
</o>
很显然这种转化出的xml和我们的本意更加的贴近一些,而且能判断出 cars这个标签的class是array,所以json表示法1更通用一些,表示法2更简单些。
所以我们想表示一个xml结构的时候尽量采用第一种,下面再写个例子
就是在刚才的例子之上,我想把这个汽车零售商店的名字加上去,代表这个商店里的东西
那么xml的结构可以表示如下:
<xiaomingjia>
<cars>
<car>
<company>德国大众</company>
<name>奥迪</name>
<price>1600</price>
</car>
<car>
<company>美国通用汽车</company>
<name>雪弗兰</name>
<price>1800</price>
</car>
</cars>
</xiaomingjia>
然后我们用json表示如下方式3和方式4
方式3,不简化,正常表示
{"xiaomingjia":{"cars":[
{"company":"德国大众","name":"奥迪","price":"1600"},
{"company":"美国通用汽车","name":"雪弗兰","price":"1800"}]
}}
方式4进行简化,表示为
[[
{
"company": "德国大众",
"name": "奥迪",
"price": "1600"
},
{
"company": "美国通用汽车",
"name": "雪弗兰",
"price": "1800"
}
]]
这个我解释下,之前没有添加<xiaomingjia>这个标签的时候,我相当于是一个数组,而添加完标签之后相当于增加了一个数组
,这里要注意最外层不能改为{},改变之后不符合json的语法了就会报错。
很显然,从json向xml转化的时候方式3语意更强,转化的结果更为接近,转化结果如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<o>
<xiaomingjia class="object">
<cars class="array">
<e class="object">
<company type="string">德国大众</company>
<name type="string">奥迪</name>
<price type="string">1600</price>
</e>
<e class="object">
<company type="string">美国通用汽车</company>
<name type="string">雪弗兰</name>
<price type="string">1800</price>
</e>
</cars>
</xiaomingjia>
</o>
<xiaoming>的标签是保留的,只是最外面多了一层跟目录。同时那个car目录也是有的,就是换了个名字,<e>标签,class是object,就是默认情况下,json数组里的元素要是对象。如果我们认为的想去显示为car,那么我们可以这样做,json结构如下所示
{"xiaomingjia":{"cars":[
{"cars":{"company":"德国大众","name":"奥迪","price":"1600"}},
{"cars":{"company":"美国通用汽车","name":"雪弗兰","price":"1800"}}]
}}
这样的话转为为xml,里面由于json默认数组里的元素是对象,已经添加了一层对象的嵌套,这里又给添加了一层对象,就会多一层嵌套结构,转化为xml后如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<o>
<xiaomingjia class="object">
<cars class="array">
<e class="object">
<cars class="object">
<company type="string">德国大众</company>
<name type="string">奥迪</name>
<price type="string">1600</price>
</cars>
</e>
<e class="object">
<cars class="object">
<company type="string">美国通用汽车</company>
<name type="string">雪弗兰</name>
<price type="string">1800</price>
</cars>
</e>
</cars>
</xiaomingjia>
</o>