[ASP.NET MVC] Controller から Json を Camel Case でシリアライズして返す

public class User {
  public string Id { get; set; }
  public string Name { get; set; }
}

public class DefaultController : Controller
{
  [HttpGet]
  public ActionResult GetPerson()
  {
    IEnumerable<User> users;

    // DB からとってきたりする

    return Json(users.ToArray(), JsonRequestBehavior.AllowGet);
  }
}

このとき、Response の Json のプロパティ名はクラスのプロパティ名が引き継がれるので Pascal Case になってしまう。

[
  {
    Id = 'hoge',
    Name = 'fuga'
  },
  ...
]

JavaScript 側では Camel Case で処理したいことが多いのでイマイチだ。 簡単な方法は 2 つある。まずは匿名オブジェクトに変換してから返すというもの。

var json = Json(users.Select(x => new
  {
    id = x.Id,
    name = x.Name
  }).ToArray(), JsonRequestBehavior.AllowGet);
return json;

もう一つは JsonConvert を使うというもの。

var jsonSerializerSetting = new JsonSerializerSettings
  {
    ContractResolver = new CamelCasePropertyNamesContractResolver()
  });
var json = JsonCovert.SerializeObject(users.ToArray(), jsonSerializerSetting)
return json;

ちなみに、 ApiController なら Web アプリ単位で設定を持てるらしい (Application_Start() で指定する)。

参考