プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

goto文の使い道

バグの原因になるからと避けていたり、よほどのことが無い限り使わなくなったgoto文ですが、昔の私が変なもの書いていたのでブログネタに

C#のコンソールアプリで

static void Main(string[] args)
{
    for (var i = 0; i < 4; i++)
    {
        Console.WriteLine($"\nFunc({i})");
        Func(i);
    }
    Console.ReadLine();
}

static void Func(int i)
{
    switch (i)
    {
    case 0:
        Console.WriteLine("case 0:");
        break;
    case 1:
        Console.WriteLine("case 1:");
        goto case 0;
    case 2:
        Console.WriteLine("case 2:");
        goto default;
    default:
        Console.WriteLine("default:");
        break;
    }
}

と書いて実行します

結果はこんな感じ

Func(0)
case 0:

Func(1)
case 1:
case 0:

Func(2)
case 2:
default:

Func(3)
default:

MSDNにもswitch-caseラベルに移動できるって書いてありました

goto (C# リファレンス)

知らなかった(過去に私はこれを使っているようなので忘れていたが正解)

まぁ・・・つかわないですよねー

ASP.NETのWeb APIが吐くJSONをlower camelケースにしたい

いつものことですがちゃんと確認していません。

ASP.NET MVC5(4?)での話です。

Web APIのGetとかはクラスをそのまま返せばあとはASP.NETが勝手にJSONにして返してくれますよね。

public class Person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

public class PersonController : ApiController
{
    public Person Get()
    {
        return new Person{FirstName="Hoge",LastName="hoge"};
    }
}

/api/person

{
"FirstName":"Hoge",
"LastName":"hoge"
}

非常に便利なんですがプロパティ名がUpper camelなのが気になりますね。JSONはLower camelが一般的っぽいですから。(ちなみに私はPascal case/Camel caseではなくUpper camel/Lower camelを好んで使っています)

クラスのプロパティをLower camelにすればいいのかもしれませんが、そうすると今度はR#先生が怒るのでこれは避けたいところです。

ということでおまじない

protected void Application_Start()
{
    // いろいろ

    GlobalConfiguration.Configuration
      .Formatters
      .JsonFormatter
      .SerializerSettings
      .ContractResolver = new CamelCasePropertyNamesContractResolver();
}

Webアプリの起動時(上の例ではGlobal.asax.cs)にこんな感じにしてあげるとJSON.NET君がLower camelでJSONを吐いてくれるようになります。

{
"firstName":"Hoge",
"lastName":"hoge"
}

ちなみに実際に動かして確認していないので事実と異なるところがあるかもしれませんが、おまじないの部分はStack Overの回答をコピペしたので間違いないと思います

おしまい

何かに使えるかもしれないデータを公開しました

はてなにそろそろ記事を書けと言われていたので書きます。

puni-o.hatenablog.com

で収集したデータをGitHubに置きました。

github.com

レシピデータは某レシピサイトをクロールして集めた物なので文句言われたら消すかもしれません。

このデータが何か面白いものを作るうえで役に立てば幸いです

2016/07/15 追記

Cookpad某レシピサイトをクロールした時のソースもGitHubに入れました。

自分がデータを使えればいいだけで公開とか考えていなかったソースなんですが、 いままでいろんな方のソースとか見させてもらっているので私も少しでも貢献できればと思い上げました。

HtmlAgilityPack使ってSQL ServerDapperで保存しているので、その辺がよくわからない方には参考になるかもしれません。