javascript

位置:IT落伍者 >> javascript >> 浏览文章

超越XML和JSON:YAM


发布日期:2018年09月20日
 
超越XML和JSON:YAM

为Java开发者对YAML文件格式做一个高级介绍找出它与XML和JSON的不同之处并检验它的优越性和缺陷

所有动态语言(如RubyGroovyPython等)及其相关的框架(如Ruby on rails)百家争鸣尽管阅读本文的大部分Java开发者每天的大多数工作都是处理纯粹的Java且未来多年都将如此但这并不意味着他们不能学习新的知识在他们的兵器库中添加新的兵器本文介绍YAML(YAML不是标记语言的简写)文件格式(使用Ruby on rails框架进行讲解因为它所有的配置文件都是使用的YAML)以及它与XML和JSON的区别最后讨论了YAML的优势和缺点

空格缩进和JSON选项

YAML文件格式主要集中于空格缩进的概念它用于指出数据的层次结构 – 而不是使用XML嵌套标记或JSON的大括号({})和方括号([])实际上它是JSON的一个超集因此在使用的时候你可能需要采用JSON风格的语法来跳出空格流它的创始人将其形容为为所有编程语言提供人性化的数据序列化标准以我的经验来看其重点是人性化

下面是一个使用空格缩进的YAML样例创建YAML文件时不宜使用固定宽度字体因为空格是很关键的(参考侧边栏YAML和标签

JFrame:

defaultCloseOperation: JFrameEXIT_ON_CLOSE

title: Test Frame

width:

height:

components:

JTextArea:

name: textArea

text: |

This is a really long text

that spans multiple lines (but preserves new lines)

It does not need to be escaped with special brackets

CDATA tags or anything like that

JButton:

name: button

text: Button

侧边栏YAML和标签

基于空格缩进的任一文件格式最常见的问题之一是如何解释标签在这个YAML例子中答案相当简单它不支持标签使用标签字符缩进代替空格将会导致处理异常

随你喜欢你可以在任何节点使用JSON风格语法或混合语法例如上面的例子可改为

JFrame:

defaultCloseOperation: JFrameEXIT_ON_CLOSE

title: Test Frame width:

height:

components:

JTextArea:

name: textArea

text: |

This is a really long text

that spans multiple lines (but preserves new lines)

It does not need to be escaped with special brackets

CDATA tags or anything like that

JButton: {name: button text: Button } #JSON风格语法

在底层节点(即它们没有子节点正如你猜测的那样井号键在YAML中是用来注释的)切换使用JSON风格语法显得特别有用

YAML结构组件

前面已经看了一个简单的YAML例子下面让我们一起来了解一下YAML的结构hashlist和block literal

hash(散列)

通过缩进子段和在关键字与值之间使用冒号(:)来分割实现hash的创建

JFrame:

defaultCloseOperation: JFrameEXIT_ON_CLOSE

title: Test Frame

width:

height:

还有一种方法就是使用与JSON兼容的大括号语法({})语法每一对关键字/值使用逗号()分割

JFrame: {defaultCloseOperation: JFrameEXIT_ON_CLOSE title: Test Framewidth: height: }

list(清单)

通过在每个list元素前放一个减号()来创建list与空格缩进一起构成了YAML的基石

components:

JTextArea

Jbutton

还有一种方法就是使用JSON兼容的方括号([])语法

components: [JTextArea JButton]

block literal(文字块)

这是YAML的亮点特别是与XML相比它的CDATA显得相当简陋block literal可以将大块文本细致地插入文件中你可以使用竖线(|)指令在你的文本中保留新行

text: |

This is a really long text

that spans multiple lines (but preserves new lines)

It does not need to be escaped with special brackets

CDATA tags or anything like that

YAML编译器将会从第一行的第一个文本字符开始编译(并丢掉所有的缩进空格)但是会在你的文本中保留新行

另外你还可以使用大于符号(>)告诉YAML编译器给所有新行加上条纹并将输入的文本作为一个长行处理

text: >

This is a really long text

that spans multiple lines (but preserves new lines)

It does not need to be escaped with special brackets

CDATA tags or anything like that

除了这两个指令之外你还可以使用竖线和加号(|+)它给位于前面的空格加上条纹保留新行和末尾的空格还可以使用大于号和减号(>它给所有的空格加上条纹

正如你从前面例子中清楚地看到那样YAML没有XML那么啰嗦了大部分YAML文件内容就是真实的数据没有了无穷尽的打开和关闭标记列表在XML中这些标记往往比它们描述的数据还大YAML更适合你需要手工维护的数据文件类型

YAML没有提供方案或DTD概念因此无法验证文件格式是否符合你的预期XML的啰嗦也有它的价值但总的说来是因为XML的成熟使它具有大量额外的工具来验证它的格式而YAML还没有

JSON也适合与任何数据它主要面向提高性能和文件尺寸的大小因为它几乎不使用空格和关闭标签然而JSON文件的内容增加了复杂性它的关闭标识就象下地狱一样这就是JavaFx代码(它基于JSON)中可见的最痛苦的了在数据文件中使用UI结构使结果更复杂其复杂程度几乎使文件变得无法理解

查看的JavaFx示例代码(点击Edit this page链接)请特别留心它是如何结束的

}

}

}

}

]

}

}

center: bookPanel

}

掺和了{}结构和[]清单使得手工维护大型的JSON风格的文件变得相当困难YAML使用它的空格缩进方法巧妙地解决了这个问题当然无论何时你都可以切换到JSON风格的语法(如在底层节点)

解析YAML文件最常用的Java库是JvYAML()JRuby(在Java VM上运行动态语言的Ruby版本)在它的Ruby on Rails框架中的进出口使用JvYAMLJvYAML提供了文件一般处理的功能(在前面那个例子中它返回了一个标准Java字符串LongMap和List对象的嵌套体系结构)使用静态dump()方法保存为文件然后使用静态load()方法载入例如

YAMLdump(Object data Writer output);

Object data = YAMLload(Reader io);

参考侧边栏基于YAML的开源项目了解关于基于YAML的开源项目信息以及如何在Java中装入一个说明的UI

侧边栏基于YAML的开源项目

请原谅我在这里厚脸皮地介绍我们自己的开源项目当我真的不知道除了JRuby外其他的基于YAML的开源项目JRuby的Ruby on Rails框架实现严重依赖YAML而不是XML或JSON看看我的Java Builder库吧()它利用YAML文件提供了一种方法定义屏幕控制布局事件线路和数据绑定以实现将说明UI装入Java

实际上YAML文件真的非常简单甚至你可以使用任何的文本编辑器都可以维护它但有些专门的文本编辑器提供了语法加亮功能这对维护工作很有帮助对Eclipse而言有Eclipse YAML editor()对NetBeans而言你可以使用来自Ruby包()的YAML编辑器然而在NetBeans 中的YAML编辑器并没有什么用处它只支持YAML很小的一个子集(例如它不支持block literal)希望在NetBeans 中的YAML编辑器解决了这个问题

我没有机会测试IntelliJ IDEA但我推测它的Ruby on Rails插件

(+IDEA+Ruby+Plugin)附带了YAML编辑器

               

上一篇:VBScript和JScript的交互与传值!

下一篇:服务端数据校验及客户端js脚本验证集成处理初探