JSON替代方案(用于指定配置)?

Ben*_*ell 11 json

我喜欢json作为我编写的软件配置文件的格式.我喜欢它轻巧,简单,并得到广泛支持.但是,我发现在json中有一些我真的很喜欢它没有的东西.

Json没有多行字符串或这里的文档(http://en.wikipedia.org/wiki/Here_document),当你希望你的json文件是人类可读和可编辑的时候,这通常很尴尬.您可以使用字符串数组,但这是一个kludgy解决方法.

Json不允许评论.

如果你看一下unix配置文件的格式,你会看到很多人为自己设计自己笨拙的格式,使用某种通用的东西真的更有意义.例如,以下是Apache配置文件中的一些代码:

RewriteEngine on
RewriteBase /temp
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml\s*;\s*q=0
RewriteCond %{REQUEST_URI} \.html
RewriteCond %{THE_REQUEST} HTTP/1\.1
RewriteRule t\.html t.xhtml [T=application/xhtml+xml]
Run Code Online (Sandbox Code Playgroud)

本质上,这里发生的是他们发明了一种非常痛苦的方式来编写布尔函数f(w,x,y,z)= w&!x&y&z.你想要一个合乎逻辑的"或"?他们也有一些独立(丑陋)的机制.

这似乎指向的是某种数据描述语言,它简单且图灵不完整,但仍比json更具表现力,灵活性和方便性.有谁知道这样的语言?

根据我的口味,XML太复杂了,而且lisp表达式具有错误的功能(Turing-completeness)并且缺少正确的功能(这里是文档,表达语法).

[编辑]标题具有误导性.我对json的下一次迭代并不感兴趣.我对作为javascript子集的语言不感兴趣.我对其他数据描述语言感兴趣.

joe*_*eln 5

EDN格式是一种基于Clojure的文字一个选项。它几乎是 JSON 的超集,只是在映射中没有特殊符号将键和值分开(就像:在 JSON 中那样);相反,所有元素都由空格和/或逗号分隔,并且映射被编码为具有偶数个元素的列表,包含在{..}.

EDN 允许注释(使用 换行;,或使用读取下一个元素的结尾#_),但不允许 here-docs。它可以使用标签符号扩展到新类型:

#myapp/Person {:first "Fred" :last "Mertz"}
Run Code Online (Sandbox Code Playgroud)

myapp/Person标签的参数(即{:first "Fred" :last "Mertz"})必须是有效的 EDN 表达式,这使得它无法扩展到 here-doc 支持。

它有两个内置标签:#inst用于时间戳和#uuid. 它还支持命名空间符号(即标识符)和关键字(即映射键常量)类型;它区分列表(..)和向量[..]。任何类型的元素都可以用作映射中的键。

在上述问题的上下文中,您可以发明一个#apache/rule-or接受一系列元素的标签,我将其语义留给您!


Mar*_*c B 1

JSON 中的“J”是“Javascript”。如果某个特定的所需语法结构不在 Javascript 中,那么它也不会在 JSON 中。

Heredocs 超出了 JSON 的权限。这是一种用于简化多行字符串定义的语言语法结构,但 JSON 是一种传输表示法。与建筑无关。但是,它确实具有多行字符串,只需\n在字符串中允许换行符即可。JSON 中没有任何内容表明字符串中不能有换行符。只要包含的引号字符正确,它就完全有效。例如

{"x":"y\nz"}
Run Code Online (Sandbox Code Playgroud)

是 100% 合法有效的 JSON,并且是多行字符串,而

{"x":"y
z"} 
Run Code Online (Sandbox Code Playgroud)

不是并且解析将会失败。