一种xml和json数据格式的简化方法
——jcstone 2021-3-31
一、xml和json的不足
在采用xml或者json描述大量结构相同的数据时,常常为其重复的属性或键名占用大量空间而头疼。为解决这一问题,笔者提出一种简化的写法,简化并压缩xml和json数据格式文件。
例如我们表达一系列位置点时候(常见geojson),xml的通常写法:
<?xml version='1.0' encoding='utf-8'?>
<setting>
<points>
<!-- pointid点号,E东坐标,N北坐标,H高程,cal是否计算;-->
<point pointid="P1" E="460634.9085" N="4476368.246" H="0" cal="true" />
<point pointid="P2" E="416114.9887" N="4424893.137" H="0" cal="true" />
<point pointid="P3" E="475361.4172" N="4411159.582" H="0" cal="true" />
</points>
</setting>
而json的通常写法:
{
"setting": {
"points": {
"point": [
{
"pointid": "P1",
"E": "460634.9085",
"N": "4476368.246",
"H": "0",
"cal": "true"
},
{
"pointid": "P2",
"E": "416114.9887",
"N": "4424893.137",
"H": "0",
"cal": "true"
},
{
"pointid": "P3",
"E": "475361.4172",
"N": "4411159.582",
"H": "0",
"cal": "true"
}
]
}
}
}
这中情形对十个点以下时,多几个属性或者键名无所谓,但对于成百上千的点,这些重复的属性和键显得臃肿笨重,数据组织工作量大。因此,人们往往选择csv文件格式,读取后数据后解析。但csv数据格式单一,对于存在数据的其它描述或者配置参数时,开发人员又不得不求助于xml或者json,导致程序数据或配置文件组织十分不便。这里笔者提出数据结构定义结合csv格式的写法,简化并压缩xml/json文件,并根据需要进行扩展。
二、极简写法
1、Xml格式
<?xml version="1.0" encoding="UTF-8" ?>
<setting>
<point col="pointid,E,N,H,iscal">
<row>P1,460634.9085,4476368.246,0,true</row>
<row>P2,416114.9887,4424893.137,0,true</row>
<row>P3,475361.4172,4411159.582,0,true</row>
</point>
</setting>
point对象col属性描述元数据列名的简单定义,row节点内容采用csv行格式描述点的各属性值。
2、Json格式
{
"setting": {
"point": {
"col": "pointid,E,N,H,iscal",
"row": [
"P1,460634.9085,4476368.246,0,true",
"P2,416114.9887,4424893.137,0,true",
"P3,475361.4172,4411159.582,0,true"
]
}
}
}
point对象col键值描述元数据列名的简单定义,row数组采用csv行格式描述点的各属性值,比原先的json格式增加了可读性。
3、极简写法的说明
极简写法通过属性值或键值描述了元数据的字段名,然后通过csv格式描述其内容。解决大量重复属性名或键名的情形。并且可读性并不比原先的方式差,简化后的json格式可读性比原来带换行格式的json更好。但是元数据的字段数据类型并没有很好地表述,对开发人员来说无法对读取的数据进行进行类型转换。
三、完整的数据结构定义简化方法
1、XML格式
<?xml version="1.0" encoding="UTF-8" ?>
<setting>
<point>
<cols>
<pointid>string</pointid>
<E>float</E>
<N>float</N>
<H>int</H>
<iscal>bool</iscal>
</cols>
<rows>
<row>P1,460634.9085,4476368.246,0.0,true</row>
<row>P2,416114.9887,4424893.137,0.0,true</row>
<row>P3,475361.4172,4411159.582,0.0,true</row>
</rows>
</point>
</setting>
2、json格式
{
"setting": {
"point": {
"cols": {
"pointid": "string",
"E": "float",
"N": "float",
"H": "int",
"iscal": "bool"
},
"rows": [
"P1,460634.9085,4476368.246,0.0,true",
"P2,416114.9887,4424893.137,0.0,true",
"P3,475361.4172,4411159.582,0.0,true"
]
}
}
}
完整的数据结构定义简化方法定义了元数据完整的结构,包含字段名称及数据类型,方便数据读入后进行处理。虽然在增加了cols一些内容,但对于大量的行数据而言,微不足道。
这里注意的是需要将数据类型根据常用的语言如python、JavaScript等对数据类型进行调整定义。当前现有各语言的xml和json读取解析包、库、模块,在读取xml/json后要根据cols定义的数据类型进一步解析。写之前也需要转为以上简化格式后再写入。