C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2006/08/29 21:24
ちょっと前から気になっていたので、ネットで色々調べてみた。

JSONとはJavaScript Object Notationの略で、JavaScriptとの親和性が非常に高いデータ交換フォーマットである。
詳しくは↓
The application/json Media Type for JavaScript Object Notation (JSON)
Introducing JSON  (→日本語翻訳ページ
JSON in JavaScript (→日本語翻訳ページ

JSONは、前回の記事で書いたオブジェクトの表記方法を応用している。
種を明かせば、例のオブジェクト表記方法を文字列化してデータのやり取りを行い、JavaScriptのeval関数でJavaScriptコードに変換(=オブジェクトに変換)するという仕組み。eval関数にJSONを渡す際は、JSONを文字列"()”で囲む必要がある。
ただ、気をつけなければいけない点がいくつか。


  • プロパティ名(リンク先に倣えば"名前")は、文字列として記述すること。

  • オブジェクト(リンク先に倣えば”値”)には、数値,Boolean値,文字列,null参照、またはこれらのみで構成される配列,オブジェクトのみ許可されている。当然だけど関数はダメ。


eval関数の性質上、これらを無視してもオブジェクトに変換することはできるが、極端な話それはJSONとは言えない。
ちなみに、JSONファイルの拡張子は.jsonである。

JSON形式のファイルを記述する例を以下に記述する。

Hoge.json{
    "piyo": "test",
    "hogera":
    {
        "foo": true,
        "bar": [10, 20, 30, 40, 50]
    }
}


Hoge.jsonをJavaScriptコードで扱う例を以下に記述する。

Hoge.jsonを扱う例function jsonControlSample(json)
{
    var hoge = eval("(" + json + ")");
    var message = "";
    message += hoge.piyo + "¥r¥n";
    message += hoge.hogera.foo + "¥r¥n";
    for (var i = 0; i < hoge.hogera.bar.length; i++)
    {
        message += hoge.hogera.bar[i] + "¥r¥n";
    }
    alert(message);
}


なお、eval関数は文字列をJavaScriptのコードに変換(して実行)する関数であるため、受け取ったJSONの中身が実は危険なJavaScriptコードを文字列化したものであったりしても、そのままコードが実行されてしまう。冒頭のリンク先にも書いてある通り、eval関数を用いるより、json.jsのJSON parserを使用した方が安全である。json.jsには、JavaScriptのオブジェクトをJSONに変換するJSON stringifierも含まれている。
タグ: Ajax JSON JavaScript
2006/08/29 16:12
JavaScriptでは、{}の中に、[プロパティ名]: [オブジェクト]という形式で記述することによりオブジェクトを表すことができる。プロパティを複数用意する場合は、カンマで区切る。
オブジェクトは通常どおり、数値やBoolean値ならそのまま記述、文字列ならダブルクォーテーションで囲んで記述、配列なら[]の中にカンマ区切りでオブジェクトを記述、関数ならfunction(){}の形式で記述する。{[プロパティ名]: [オブジェクト], ...}の形式のオブジェクトも当然含ませることができる。
以下に例を記述。

オブジェクトを直接記述する例var obj1 =
{
    p1: 1,
    p2: "1",
    p3:
        [
            {
                p1: "a1",
                p2: "a2"
            },
            {
                p1: "b1",
                p2: "b2"
            }
        ],
    m1:
        function()
        {
            alert(this.p1 + this.p2);
        },
    m2:
        function()
        {
            var message = "";
            for (var i = 0; i < this.p3.length; i++)
            {
                message += this.p3[i].p1 + "," + this.p3[i].p2 + "¥r¥n";
            }
            alert(message);
        },
    m3:
        function(arg1)
        {
            alert(arg1);
        }
}

obj1.m1();
obj1.m2();
obj1.m3("test1");