285

私の問題は、 JSON.NET によってシリアル化された ASP.NET MVC コントローラー メソッドから ActionResult を介して (標準の PascalCase とは対照的に) camelCased JSON データを返したいことです

例として、次の C# クラスを考えてみましょう。

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

デフォルトでは、このクラスのインスタンスを MVC コントローラーから JSON として返す場合、次の方法でシリアル化されます。

{
  "FirstName": "Joe",
  "LastName": "Public"
}

次のように(JSON.NETで)シリアル化したいと思います:

{
  "firstName": "Joe",
  "lastName": "Public"
}

どうすればいいですか?

4

13 に答える 13

451

または、簡単に言えば:

JsonConvert.SerializeObject(
    <YOUR OBJECT>, 
    new JsonSerializerSettings 
    { 
        ContractResolver = new CamelCasePropertyNamesContractResolver() 
    });

例えば:

return new ContentResult
{
    ContentType = "application/json",
    Content = JsonConvert.SerializeObject(new { content = result, rows = dto }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }),
    ContentEncoding = Encoding.UTF8
};
于 2014-03-18T15:00:20.890 に答える
103

Mats Karlsson のブログで、この問題に対する優れた解決策を見つけました。解決策は、JSON.NET 経由でデータをシリアル化する ActionResult のサブクラスを作成し、後者を camelCase 規則に従うように構成することです。

public class JsonCamelCaseResult : ActionResult
{
    public JsonCamelCaseResult(object data, JsonRequestBehavior jsonRequestBehavior)
    {
        Data = data;
        JsonRequestBehavior = jsonRequestBehavior;
    }

    public Encoding ContentEncoding { get; set; }

    public string ContentType { get; set; }

    public object Data { get; set; }

    public JsonRequestBehavior JsonRequestBehavior { 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("This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.");
        }

        var response = context.HttpContext.Response;

        response.ContentType = !String.IsNullOrEmpty(ContentType) ? ContentType : "application/json";
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data == null)
            return;

        var jsonSerializerSettings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
        response.Write(JsonConvert.SerializeObject(Data, jsonSerializerSettings));
    }
}

次に、このクラスを MVC コントローラー メソッドで次のように使用します。

public ActionResult GetPerson()
{
    return new JsonCamelCaseResult(new Person { FirstName = "Joe", LastName = "Public" }, JsonRequestBehavior.AllowGet)};
}
于 2013-10-18T09:07:42.963 に答える
61

WebAPIについては、次のリンクを確認してください: http://odetocode.com/blogs/scott/archive/2013/03/25/asp-net-webapi-tip-3-camelcasing-json.aspx

基本的に、このコードを に追加しますApplication_Start

var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var settings = jsonFormatter.SerializerSettings;
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
于 2015-02-05T06:33:17.203 に答える
41

これがあなたが探しているシンプルな答えだと思います。これは、Shawn Wildermuthのブログからのものです。

// Add MVC services to the services container.
services.AddMvc()
  .AddJsonOptions(opts =>
  {
    opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
  });
于 2016-01-06T21:30:11.727 に答える
9

ファイル「Startup.cs」で設定を行う必要があります

また、JsonConvert のデフォルト値で定義する必要があります。これは、後でライブラリを直接使用してオブジェクトをシリアル化したい場合です。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
            .AddJsonOptions(options => {
                options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            });
        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        };
    }
于 2019-07-30T18:06:28.753 に答える
9

Json NamingStrategyプロパティをクラス定義に追加します。

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

于 2020-08-24T11:25:56.123 に答える
7

ASP.NET Core MVC で。

    public IActionResult Foo()
    {
        var data = GetData();

        var settings = new JsonSerializerSettings 
        { 
            ContractResolver = new CamelCasePropertyNamesContractResolver() 
        });

        return Json(data, settings);
    }
于 2016-10-05T14:10:01.120 に答える
-1

インストール パッケージ Microsoft.AspNetCore.Mvc.NewtonsoftJson

これは私の問題を解決します

于 2021-12-24T22:42:10.527 に答える