2012-01-11 8 views
8

私は書き込むソフトウェアの設定ファイルの形式としてjsonが好きです。軽量でシンプルで広くサポートされているのが好きです。しかし、私はそれが持っていないjsonで本当に好きなことがいくつかあることを発見しています。JSONの代替(構成を指定するため)

Jsonは、複数行の文字列やここのドキュメント(http://en.wikipedia.org/wiki/Here_document)を持っていないので、jsonファイルを人間が読んで編集可能にしたい場合は非常に扱いにくいことがよくあります。あなたは文字列の配列を使うことができますが、それはクルーディーな回避策です。

Jsonはコメントを許可しません。

UNIX設定ファイルの形式を見ると、何らかの汎用目的を使用して実際に行うのがより理にかなっているような、自分自身の扱いにくい形式を設計している人が多くいます。何ここで起こっていることは、彼らが(X、Y、Z、W)ブール関数fの書き込みが非常に痛みを伴う方法を発明したことで、基本的に

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] 

:たとえば、ここではApacheの設定ファイルからコードをいくつかです= w &!x &y & z。あなたは論理的な "または"をしたいですか?彼らはそれのために別の(醜い)仕組みを持っています。

これは、シンプルでチューリング不完全ですが、さらに表現力豊かで柔軟性があり、jsonよりも便利な、ある種のデータ記述言語です。誰もそのような言語を知っていますか?

私の好みとしては、XMLは複雑すぎるし、Lisp式は間違った機能(Turing-completeness)を持ち、適切な機能がない(ここでは文書、表現構文)。

[編集]タイトルは誤解を招く恐れがあります。私は文字通りjsonの次の反復に興味がありません。私はJavaScriptのサブセットである言語には興味がありません。私は代替のデータ記述言語に興味があります。

+3

[YAML](http://en.wikipedia.org/wiki/YAML)? – BalusC

+0

@BalusC:興味深い提案:-)しかし、YAMLは、ブール関数/ Apacheの例や、似たような風味のアプリケーションを実行する素晴らしい方法を提供していないようです。 –

答えて

1

JSONの「J」は「Javascript」です。特定の構文構文がJavascriptにない場合、JSON上には存在しません。

HeredocsはJSONの権限を超えています。単純化された複数行の文字列定義のための言語構文構文ですが、JSONはトランスポート表記です。それは建設とは関係ありません。しかし、文字列内に改行文字を\nにするだけで、複数行の文字列を持つことができます。 JSONには、文字列に改行を付けることはできないということは何もありません。引用符が含まれている限り、完全に有効です。例えば

{"x":"y 
z"} 

はなく、構文解析に失敗するのに対し

{"x":"y\nz"} 

は、100%合法的に有効なJSONで、複数行の文字列です。

+0

"特定の構文構文がJavascriptにない場合、JSON上には存在しません。"それはかわいいですが、JSONは実際にJavaScriptのサブセットではなく、JavaScriptがサポートしていないものをサポートしています。 – kyrias

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 */ 
} 

あなたは(FFは現在、E4Xをサポートする唯一のブラウザである)FirefoxのJavaScriptエンジンを使用することができますかあなたが本当にあなた自身のパーサーを実装することができますそれほど難しいことではありません。 JSON(おそらく最も重要)の

Here's the E4X quickstart guide, too.

+0

興味深い考えですが、それはチューリング不完全さの基準には合格しません。 –

+0

ネットワーク帯域幅を節約するために空白を圧縮する方法は?ありがとう。 –

+1

@AizzatSuhardi:実際のJSONを使用する – Ryan

0

一つの重要な属性を使用すると、文字列表現とオブジェクトの形で表現し、オブジェクトの形を表現するために使用されるオブジェクトの間で簡単に「フリップ」は比較的あることができるということです単純な配列とマップ。これがJSONをネットワーキングのコンテキストで非常に便利にする理由です。

あなたが望む機能は、JSONのこの二重の性質と競合します。

4

EDN formatは、Clojureリテラルに基づく1つのオプションです。 JSONのほとんどのスーパーセットですが、特別なシンボルがキーと値をマップで区切っていないことを除いて(:はJSONと同じです)。むしろすべての要素は空白やコンマで区切られ、マップは{..}で囲まれた偶数の要素を持つリストとしてエンコードされます。

EDNは、を使用する改行、または#_を使用して読み取られる次の要素の末尾にコメントを許可しますが、here-docsは使用できません。それはタグ表記法を使用して、新しいタイプに拡張可能である:

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

myapp/Personタグの引数(すなわち{:first "Fred" :last "Mertz"})それはunextensibleここ-docのサポートになり、有効なEDN式でなければなりません。

タイムスタンプ用の#inst#uuidの2つの組み込みタグがあります。また、名前空間シンボル(すなわち識別子)およびキーワード(すなわちマップキー定数)タイプもサポートする。リスト(..)とベクトル[..]を区別します。任意のタイプの要素がマップのキーとして使用できます。

あなたの上記の問題の文脈では、#apache/rule-orタグは、私があなたに任せているセマンティクスの要素を受け入れることができます。

0

設定には、組み込み可能なスクリプト言語(luaやpythonなど)を使用することができますが、これは実際に設定するのが一般的ではありません。これにより、複数行の文字列やここでのドキュメント、コメントが得られます。また、ブール関数のようなものを簡単に記述することもできます。しかし、もちろん、スクリプト言語は完全にチューリングされています。

4

は、それはJSONよりもさらに簡単ですhttp://igagis.github.io/stob/

を見てください。

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

+0

嬉しい生の文字列リテラルを持っています。残念ながら、生の文字列のサポートはC++ライブラリでのみ実装されています。 C#とJavaのlibsは、現時点では未処理の文字列のサポートが不足しています。 – igagis

+0

OS開発のコラボレーションが必要だと思います。特にC#ライブラリの改善が必要なのは、C++の開発者が書いたようなものです:) – Abdurrahim

関連する問題