2012-01-11 131 views
8

我喜歡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表達式具有錯誤的特性(圖靈完備性)並且缺乏正確的特性(這裏是文檔,表達式語法)。

[編輯]標題有誤導性。我對json的下一次迭代並不感興趣。我對javascript的子集不感興趣。我對其他數據描述語言感興趣。

+3

[YAML](http://en.wikipedia.org/wiki/YAML)? – BalusC 2012-01-11 03:23:16

+0

@BalusC:有趣的建議:-)但YAML似乎沒有提供任何布爾函數/ Apache示例或類似風格的應用程序的好方法。 – 2012-01-11 03:52:31

回答

1

JSON中的'J'是「Javascript」。如果某個特定的語法結構不在Javascript中,那麼它將不在JSON上。

Heredocs超出了JSON的範圍。這是簡化多行字符串定義的語言語法結構,但JSON是一種傳輸符號。它與建築無關。但是,它確實有多行字符串,只需在字符串中允許使用\n換行符。 JSON中沒有什麼說你不能在字符串中換行。只要包含引號字符是正確的,它就完全有效。例如

{"x":"y\nz"} 

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

{"x":"y 
z"} 

是不是和失敗的解析。

+0

「如果特定的期望語法結構不在Javascript中,那麼它不會在JSON上。」這很可愛,但JSON實際上並不是JavaScript的一個子集,並且支持JavaScript不支持的東西。 – kyrias 2016-11-07 13:38:44

2

我總是喜歡稱之爲「真正的JSON」。 JSON代表JavaScript Object Notation,而JavaScript 確實有有足夠的評論和足夠接近heredocs的內容。

對於定界符,你可以使用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.

+0

有趣的想法,雖然它不符合圖靈不完整性的標準。 – 2012-12-26 03:42:39

+0

壓縮白空間以節省網絡帶寬的方式是什麼?謝謝。 – 2013-12-12 04:58:17

+1

@AizzatSuhardi:使用實際的JSON JSON – Ryan 2013-12-12 05:01:26

0

一個JSON(可能是最重要的)的重要屬性是,可以很容易地「翻轉」的字符串表示和對象形式的表示,以及用於表示對象形狀的對象之間的相對簡單的數組和地圖。這使得JSON在網絡環境中非常有用。

你想要的功能會與這種JSON的雙重性質相沖突。

4

EDN format是基於Clojure文字的一個選項。它幾乎是JSON的超集,除了沒有特殊的符號將地圖中的鍵和值分開(如JSON中的:);相反,所有元素由空格和/或逗號分隔,並且地圖編碼爲包含在{..}中的偶數個元素的列表。

EDN允許評論(使用;的換行符,或使用#_讀取的下一個元素的結尾),但不是在這裏 - 文檔。它是可擴展到使用標籤符號新類型:

#myapp/Person {:first "Fred" :last "Mertz"} 

myapp/Person所述標記的參數(即{:first "Fred" :last "Mertz"})必須是有效的EDN表達,這使得它不可延伸到這裏-doc的支持。

它有兩個內置標籤:#inst時間戳和#uuid。它還支持命名空間符號(即標識符)和關鍵字(即地圖鍵常量)類型;它將列表(..)和矢量[..]區分開來。任何類型的元素都可以用作地圖中的鍵。

在上述問題的背景下,可以發明一個#apache/rule-or標籤,它接受一系列元素,其語義我留給你!

0

對於配置,您可以使用可嵌入的腳本語言,例如lua或python,事實上這對於配置來說並不罕見。這給你多行字符串或這裏的文件和評論。它也使得擁有像你所描述的布爾函數更容易。但是,腳本語言當然是圖靈完整的。

4

看一看http://igagis.github.io/stob/

它比JSON更簡單。

它有C++風格的評論。

如果需要「真正的」新行或標籤,可以對多行​​字符串進行格式化並使用轉義的新行\ n和製表符\ t字符。

下面是示例片段:

"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" 
} 
+0

這是一見鍾情。它甚至有原始字符串真棒 – Abdurrahim 2017-03-10 09:16:53

+0

很高興你喜歡它。不幸的是,原始字符串支持僅在C++庫中實現。 C#和Java庫目前缺乏原始字符串支持。 – igagis 2017-03-10 10:57:41

+0

猜測現在是合作開發OS的時候了。尤其是C#庫需要改進,好像是C++開發者寫的那樣:) – Abdurrahim 2017-03-11 14:38:25