我喜欢json作为我编写的软件配置文件的格式。我喜欢它轻巧,简单并得到广泛支持。但是,我发现在json中有一些我真正喜欢的东西,它没有。
Json没有多行字符串或这里的文档(http://en.wikipedia.org/wiki/Here_document),当你希望你的json文件是人类可读和可编辑的时候,这通常很尴尬。您可以使用字符串数组,但这是一个愚蠢的解决方法。
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]
基本上,这里发生的是他们发明了一种非常痛苦的写布尔函数f(w,x,y,z)= w&!x& y& z的方法。你想要一个合乎逻辑的"或"?他们也有一些独立(丑陋)的机制。
这似乎指向的是某种数据描述语言简单且图灵不完整,但仍然比json更具表现力,灵活性和方便性。有谁知道这种语言?
根据我的口味,XML过于复杂,而且lisp表达式具有错误的功能(Turing-completeness)并且缺少正确的功能(这里是文档,表达语法)。
[编辑]标题具有误导性。我对json的下一次迭代并不感兴趣。我对作为javascript子集的语言不感兴趣。我对其他数据描述语言感兴趣。
答案 0 :(得分:4)
EDN format是基于Clojure文字的一种选择。它几乎是JSON的超集,除了没有特殊符号在地图中分隔键和值(如:
在JSON中所做的那样);相反,所有元素都用空格和/或逗号分隔,地图被编码为一个包含偶数个元素的列表,括在{..}
中。
EDN允许评论(使用;
换行,或使用#_
读取下一个元素的结尾),但不允许使用here-docs。它可以使用标记表示法扩展到新类型:
#myapp/Person {:first "Fred" :last "Mertz"}
myapp/Person
标记(即{:first "Fred" :last "Mertz"}
)的参数必须是有效的EDN表达式,这使得here-doc支持无法扩展。
它有两个内置标记:#inst
用于时间戳和#uuid
。它还支持命名空间符号(即标识符)和关键字(即映射键consts)类型;它区分了列表(..)
和向量[..]
。任何类型的元素都可以用作地图中的键。
在上述问题的上下文中,可以发明一个#apache/rule-or
标签,它接受一系列元素,我的语义留给你!
答案 1 :(得分:4)
查看http://igagis.github.io/stob/
它甚至比JSON更简单。
它有C ++风格的评论。
可以格式化多行字符串并使用转义的新行\ n和tab \ t字符,如果" real"需要新的行或标签。
以下是示例摘录:
"String object"
AnotherStringObject
"String with children"{
"child 1"
Child2
"child three"{
SubChild1
"Subchild two"
Property1 {Value1}
"Property two" {"Value 2"}
//comment
/* multi-line
comment */
"multi-line
string"
"Escape sequences \" \n \r \t \\"
}
R"qwerty(
This is a
raw string, "Hello world!"
int main(argc, argv){
int a = 10;
printf("Hello %d", a);
}
)qwerty"
}
答案 2 :(得分:2)
我总是喜欢称之为“真正的JSON”。 JSON代表JavaScript Object Notation,而JavaScript 确实有评论和与heredocs足够接近的东西。
对于heredoc,您将使用JavaScript的E4X内联XML:
{
longString: <>
Hello, world!
This is a long string made possible with the magic of E4X.
Implementing a parser isn't so difficult.
</>.toString() // And a comment
/* And another
comment */
}
你可以使用Firefox的JavaScript引擎(FF是目前唯一支持E4X的浏览器),或者你可以实现自己的解析器,这真的不是那么困难。
答案 3 :(得分:1)
JSON中的'J'是“Javascript”。如果特定的所需语法构造不在Javascript中,那么它将不在JSON上。
Heredocs超出了JSON的范围。这是用于简化多行字符串定义的语言语法构造,但JSON是一种传输符号。它与建筑无关。但是,它确实有多行字符串,只需在字符串中允许\n
换行符。 JSON中没有任何内容表明您不能在字符串中使用换行符。只要包含引号字符是正确的,它就完全有效。 e.g。
{"x":"y\nz"}
是100%合法的有效JSON,是多行字符串,而
{"x":"y
z"}
不会,也会在解析时失败。
答案 4 :(得分:0)
JSON的一个重要属性(可能是最重要的)是您可以在字符串表示和对象形式的表示之间轻松“翻转”,用于表示对象表单的对象是相对简单的数组和映射。这就是使JSON在网络环境中如此有用的原因。
您想要的功能会与JSON的这种双重性质发生冲突。
答案 5 :(得分:0)
对于配置,您可以使用可嵌入的脚本语言,例如lua或python,实际上这对配置来说并不常见。这为您提供了多行字符串或此处的文档和注释。它还可以更容易地使用您描述的布尔函数。但是,脚本语言当然是Turing complete。
答案 6 :(得分:0)
自March 2018起,您可以使用JSON5,它似乎已添加了JSON中您(以及许多其他人)所缺少的所有内容。
简短示例(JSON5)
{
// comments
unquoted: 'and you can quote me on that',
singleQuotes: 'I can use "double quotes" here',
lineBreaks: "Look, Mom! \
No \\n's!",
hexadecimal: 0xdecaf,
leadingDecimalPoint: .8675309, andTrailing: 8675309.,
positiveSign: +1,
trailingComma: 'in objects', andIn: ['arrays',],
"backwardsCompatible": "with JSON",
}
JSON5数据交换格式(JSON5)是JSON的超集, 旨在通过扩展JSON来减轻JSON的某些限制 语法以包含ECMAScript 5.1中的某些产品。
功能摘要
以下ECMAScript 5.1功能在以下版本中不受支持 JSON,已扩展为JSON5。
对象
- 对象键可以是ECMAScript 5.1 IdentifierName。
- 对象可能只有一个逗号。
数组
- 数组可能只有一个结尾逗号。
字符串
- 字符串可以用单引号引起来。
- 字符串可以通过转义换行符来跨越多行。
- 字符串可能包含字符转义符。
数字
- 数字可能是十六进制的。
- 数字的前导或尾随小数点。
- 数字可以是IEEE 754正无穷大,负无穷大和NaN。
- 数字可能以显式加号开头。
评论
- 允许单行和多行注释。
空白
- 允许使用其他空格字符。
答案 7 :(得分:0)