什么是JSON文件
JSON文件是用来存储简单的数据结构和对象的文件,可以在web应用程序中进行数据交换;JSON是全称为JavaScript Object Notation,是一种有条理,易于访问的存储信息的方法。
JSON文件可以转换为XML文件
对比JSON和XML
以如下片段为例
JSON
{
"store": {
"book": [{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
}, {
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
}, {
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
}, {
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
XML
<?xml version="1.0" encoding="UTF-8" ?>
<store>
<book>
<category>reference</category>
<author>Nigel Rees</author>
<title>Sayings of the Century</title>
<price>8.95</price>
</book>
<book>
<category>fiction</category>
<author>Evelyn Waugh</author>
<title>Sword of Honour</title>
<price>12.99</price>
</book>
<book>
<category>fiction</category>
<author>Herman Melville</author>
<title>Moby Dick</title>
<isbn>0-553-21311-3</isbn>
<price>8.99</price>
</book>
<book>
<category>fiction</category>
<author>J. R. R. Tolkien</author>
<title>The Lord of the Rings</title>
<isbn>0-395-19395-8</isbn>
<price>22.99</price>
</book>
<bicycle>
<color>red</color>
<price>19.95</price>
</bicycle>
</store>
JSON优点
- JSON文件体积比XML小,数据内容越多两者相差越大
JSON缺点
- JSON引号需要转义, 写为" ,虽然XML也有五个实体包括引号需要转义,但是目前XML工具比较完善 ,很多都能够自动转义,但是JSON还没有如此普及
- JSON没有文件头标志, 对比XML的
<?xml version="1.0" encoding="UTF-8" ?>
标记版本和文件编码格式对于不同语言和国家地区有时是很重要的 - XML有DOM和SAX两种解析方式,JSON目前只有一种
JSON的翻译处理
SDL Trados Studio 中内置了JSON的处理解析器
默认处理JSON全部内容,并且支持JSONPATH自定义和嵌入式内容处理
JSON PATH
JSON PATH是和XPATH类似的一种处理语言,对JSON文件进行选择,语法上和XPATH非常接近
语法点:
$
表示文档的根元素@
表示文档的当前元素.node_name
或['node_name']
匹配下级节点[index]
检索数组中的元素[start:end:step]
支持数组切片语法*
作为通配符,匹配所有成员..
子递归通配符,匹配成员的所有子元素(<expr>)
使用表达式?(<boolean expr>)
进行数据筛选
对比XPATH
XPath | JsonPath | 说明 |
---|---|---|
/ | $ | 文档根元素 |
. | @ | 当前元素 |
/ | .或[] | 匹配下级元素 |
… | N/A | 匹配上级元素,JsonPath不支持此操作符 |
// | … | 递归匹配所有子元素 |
* | * | 通配符,匹配下级元素 |
@ | N/A | 匹配属性,JsonPath不支持此操作符 |
[] | [] | 下标运算符,根据索引获取元素,XPath索引从1开始,JsonPath索引从0开始 |
| | [,] | 连接操作符,将多个结果拼接成数组返回,可以使用索引或别名 |
N/A | [start:end:step] | 数据切片操作,XPath不支持 |
[] | ?() | 过滤表达式 |
N/A | () | 脚本表达式,使用底层脚本引擎,XPath不支持 |
() | N/A | 分组,JsonPath不支持 |
- JsonPath的索引从0开始计数, XPATH索引从1开始计数
针对上面示例文件的对比
XPath | JsonPath | 说明 |
---|---|---|
/store/book/author | $.store.book[*].author | 所有book的author节点 |
//author | $…author | 所有author节点 |
/store/* | $.store.* | store下的所有节点,book数组和bicycle节点 |
/store//price | $.store…price | store下的所有price节点 |
//book[3] | $…book[2] | 匹配第3个book节点 |
//book[last()] | $…book[(@.length-1)],或 $…book[-1:] | 匹配倒数第1个book节点 |
//book[position()<3] | $…book[0,1],或 $…book[:2] | 匹配前两个book节点 |
//book[isbn] | $…book[?(@.isbn)] | 过滤含isbn字段的节点 |
//book[price<10] | $…book[?(@.price<10)] | 过滤price<10的节点 |
//* | $…* | 递归匹配所有子节点 |
对与上面的例子,Store中有Book和Bicycle,仅翻译book相关的说明部分,设置如下
针对category,author,title添加了三条规则
$.store.book[*].category
$.store.book[*].author
$.store.book[*].title
实现效果如下
对比和总结
JSON 解析器功能上还是很局限,例如只能设置要翻译的部分不能反向设置满足条件则不翻译内容,实现除此之外