ASP .Net Core1.0.0-rc2-finalから1.0.0へのスワップ時にJSONプロパティが小文字になりました


92

プロジェクトをASP.Net Core1.0.0-rc2-finalから1.0.0に交換しました。JSONプロパティが大文字になっているため、当社のWebサイトとクライアントは機能しなくなりました。たとえば、JavaScriptのこの行は失敗します

for (var i = 0; i < collection.Items.length; i++){

コントローラが配列を「Items」ではなく「items」と呼ぶようになったためです。更新されたパッケージをインストールし、project.jsonファイルを編集する以外に変更を加えていません。プロパティを引き続き使用するC#モデルファイルは変更していません。

ASP.Net Coreコントローラーが小文字のプロパティでJSONを返し始めたのはなぜですか?モデルのプロパティ名のケースを尊重して、それらに戻るにはどうすればよいですか?



2
.Net Core 3の答えをお探しの方は、ページの一番下までスクロールする必要があります。
MikeDevenney19年

回答:


159

MVCは、デフォルトでキャメルケース名を使用してJSONをシリアル化するようになりました

デフォルトでキャメルケース名を避けるためにこのコードを使用してください

  services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

ソース:https//github.com/aspnet/Announcements/issues/194


8
netcore2:Newtonsoft.Json.Serializationを使用します。
david.barkhuizen 2017

3
JSONシリアル化のすべてを変更たくはありません。一部のサードパーティソフトウェアの動作と一致させる必要がある特定のケースを1つだけ変更ます。Json()呼び出しの2番目のパラメーターで正しいシリアル化設定を提供するにはどうすればよいですか?
Auspex 2018年

82

これをGoogleから見つけて、Core3のソリューションを探している場合。

Core 3はを使用System.Text.Jsonしますが、デフォルトでは大文字と小文字は区別されません。このGitHubの問題で述べたように、PropertyNamingPolicyをnullに設定すると、問題が修正されます。

public void ConfigureServices(IServiceCollection services)
{
...
    services.AddControllers()
            .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

グローバル設定を変更したくない場合は、1つのアクションに対して次のようになります。

return Json(obj, new JsonSerializerOptions { PropertyNamingPolicy = null });

8
あなたは私の主であり救い主です
JontyMorris20年

1
これは、Core3.1でうまく機能しました。剣道のコンポーネントを正しく動作させることができず、jsonがキャメルケース形式であることがわかりました。これで問題は解決しました。
ワラギ

私はまた、あなたの主題だ
ジョアン・ルーレイロ


10

Core 3.1に移行し、Core MVCプロジェクトを使用している場合は、Startup.csで次のセットアップコードを使用できます。


        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddControllersWithViews().AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);
            ...
        }

これは、従来、回答stackoverflow.com/a/58187836/125981と同じである
マーク・庄屋

@MarkSchultheissあなたはおそらく正しいでしょう、私の答えは他のすべてのものと似ていますが、ビューを利用するMVCである私のプロジェクトタイプに基づいて適切な答えを検索したとき、私のプロジェクトに一致する正確な答えが見つかりませんでした。AddControllersWithViews()はそれらの欠けている部分を追加します、そして私はそれが将来誰にとっても役立つだろうと思いました。コメントありがとうございます!
UY

3

これにより、dotnet core 3 webapiで修正されるため、プロパティ名はまったく変更されず、意図したとおりにクライアントに戻ります。

Startup.csの場合:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
        services.AddHttpClient();
    }

これは、従来の回答と同じであるstackoverflow.com/a/58187836/125981
マーク・庄屋

1

(ASP.NET Coreではなく)ASP.net WEBAPIを使用している人向け。

この行をWebApiConfigに追加します。

//Comment this jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

jsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver();

これは、ウェブAPIのグーグル検索でも最初に表示されるため、ここに回答として追加します。


0

Core 2.xバージョンの場合、このコードを使用すると、デフォルトでキャメルケース名を回避できます。Startup.csファイルのConfigureServicesメソッド内に次のコードを追加する必要があります。

services.AddMvc()
.AddJsonOptions(o =>
{
    if (o.SerializerSettings.ContractResolver != null)
    {
        var castedResolver = o.SerializerSettings.ContractResolver
        as DefaultContractResolver;

        castedResolver.NamingStrategy = null;
    }
});

0

グローバルに設定したくない場合は、ContractResolverを使用してJsonの結果として返すこともできます。

public IActionResult MyMethod()
{
    var obj = new {myValue = 1};
    return Json(obj, new JsonSerializerSettings {ContractResolver = new DefaultContractResolver()});
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.