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

时间:2012-01-11 03:14:40

标签: json

我喜欢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子集的语言不感兴趣。我对其他数据描述语言感兴趣。

8 个答案:

答案 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的浏览器),或者你可以实现自己的解析器,这真的不是那么困难。

Here's the E4X quickstart guide, too.

答案 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。
  •   
  • 数字可能以显式加号开头。
  •   
     

评论

     
      
  • 允许单行和多行注释。
  •   
     

空白

     
      
  • 允许使用其他空格字符。
  •   

GitHub:https://github.com/json5/json5

答案 7 :(得分:0)

还有thindf

尽管它不支持注释,但是可以通过空键来模拟它们:

flake8-black