36

アクションがすべてのプロパティがキャメルケースにある JsonResult を返すようにしようとしています。

私は単純なモデルを持っています:

public class MyModel
{
    public int SomeInteger { get; set; }

    public string SomeString { get; set; }
}

そして、単純なコントローラー アクション:

public JsonResult Index()
    {
        MyModel model = new MyModel();
        model.SomeInteger = 1;
        model.SomeString = "SomeString";

        return Json(model, JsonRequestBehavior.AllowGet);
    }

このアクション メソッドを呼び出すと、次のデータを含む JsonResult が返されるようになりました。

{"SomeInteger":1,"SomeString":"SomeString"}

私の用途では、次のようにキャメルケースでデータを返すアクションが必要です。

{"someInteger":1,"someString":"SomeString"}

これを行うエレガントな方法はありますか?

ここで可能な解決策を探していたところ、MVC3 JSON Serialization: How to control the property names? が見つかりました。モデルのすべてのプロパティに DataMember 定義を設定しますが、実際にはこれを行いたくありません。

また、この種の問題を正確に解決できると彼らが言うリンクを見つけました: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-シリアル化#json_camelcasing . それは言います:

データ モデルを変更せずに JSON プロパティ名をキャメル ケースで記述するには、シリアライザーで CamelCasePropertyNamesContractResolver を設定します。

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

このブログhttp://frankapi.wordpress.com/2012/09/09/going-camelcase-in-asp-net-mvc-web-api/の 1 つのエントリでも、このソリューションについて言及されており、単純にこの問題を修正するには、RouteConfig.RegisterRoutesを使用します。やってみましたが、うまくいきませんでした。

私がどこで何か間違ったことをしていたのか分かりますか?

4

2 に答える 2

13

コントローラのJson関数は、JsonResultsを作成するための単なるラッパーです。

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

protected internal JsonResult Json(object data, string contentType)
{
    return Json(data, contentType, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding)
{
    return Json(data, contentType, contentEncoding, JsonRequestBehavior.DenyGet);
}

protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, behavior);
}

protected internal JsonResult Json(object data, string contentType, JsonRequestBehavior behavior)
{
    return Json(data, contentType, null /* contentEncoding */, behavior);
}

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

JsonResultは内部でJavaScriptSerializerを使用するため、シリアル化プロセスを制御することはできません。

public class JsonResult : ActionResult
{
    public JsonResult()
    {
        JsonRequestBehavior = JsonRequestBehavior.DenyGet;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { get; set; }

    /// <summary>
    /// When set MaxJsonLength passed to the JavaScriptSerializer.
    /// </summary>
    public int? MaxJsonLength { get; set; }

    /// <summary>
    /// When set RecursionLimit passed to the JavaScriptSerializer.
    /// </summary>
    public int? RecursionLimit { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
            String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException(MvcResources.JsonRequest_GetNotAllowed);
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            if (MaxJsonLength.HasValue)
            {
                serializer.MaxJsonLength = MaxJsonLength.Value;
            }
            if (RecursionLimit.HasValue)
            {
                serializer.RecursionLimit = RecursionLimit.Value;
            }
            response.Write(serializer.Serialize(Data));
        }
    }
}

独自のJsonResultを作成し、独自のJsonコントローラー関数を作成する必要があります(必要な場合/必要な場合)。新しいものを作成することも、既存のものを上書きすることもできます。それはあなた次第です。このリンクも興味があるかもしれません。

于 2013-02-26T10:11:12.483 に答える