だるろぐ

明日できることは、今日しない。

失敗の数だけ強くなりたい( Jason.NET についての補足

f:id:daruyanagi:20120725203328p:plain

失敗の数だけ強くなりたい - だるろぐ の補足。

"files": {
    "close_duplicate_tab.js": {
        "type": "application/javascript",
        "filename": "close_duplicate_tab.js",
        "raw_url": "https://gist.github.com/raw/3175551/c7590ad8cfdd352150a8c845ff96fb9f30bd3a65/close_duplicate_tab.js",
        "language": "JavaScript",
        "size": 1465
    }
}

この Json は Dictionary<string, File> でうけることになるのだけど、 File を最初以下のとおりに定義していた。

public struct File
{
    public string @type;
    public string filename;
    public string raw_url;
    public string language;
    public string size;
}

これでもいいのだけれど、フィールドはビューへバインディングできないのでプロパティにした、というのは前回に言った*1

public struct File
{
    public string @type { get; set; }
    public string filename { get; set; }
    public string raw_url { get; set; }
    public string language { get; set; }
    public string size { get; set; }
}

これでうまくいったのだけれど……うっかり struct を class にしてなかった。それでも動くんだな…… struct でもプロパティ持てるの?*2 よくわからなくなってくる。ここでは値を渡すことはないし、のちのち面倒くさいことになったら嫌なので class にしておいたほうが無難かな。

まぁ、それは置いておこう。

次に気になるのは、プロパティが Snake Case になっていること。やっぱり Pascal Case にしておきたい。試してみたところ*3、 Jason.NET でデシリアライズするときには大文字と小文字が区別されないようなので、先頭を大文字にしてもいいようだ。

public class File
{
    public string @Type { get; set; }
    public string Filename { get; set; }
    public string Raw_Url { get; set; }
    public string Language { get; set; }
    public string Size { get; set; }
}

しかし、これでも Raw_Url のようにアンダーバーが残ってしまう。 Snake Case を勝手に Pascal Case のフィールド・プロパティへ割り当ててくれないかなぁ、とほのかに期待していたのだけれど、そこまではやってくれないみたい*4。そんなときは、 JasonProperty 属性を利用すればよいようだ。

public class File
{
    public string @Type { get; set; }
    public string Filename { get; set; }
    [JsonProperty("raw_url")]
    public string RawUrl { get; set; }
    public string Language { get; set; }
    public string Size { get; set; }
}

それだけ。

*1:type の前に @ をつけるのは、 type が予約語であるため。アクセスする場合は File.type でよい

*2:持てるらしい! struct はメンバ関数をもてるので、プロパティがプライベートメンバ変数およびそのセッター・ゲッターの糖衣構文だと考えれば、別にできてもおかしくはないということかなぁ。教えて、エロいひと!

*3:ドキュメント読めよ

*4:Ruby on Rails ならやってくれただろう