ASP.NET Core 3.0 System.Text.Json Camel Case Serialization


19

ASP.NET Core 3.0 Web APIプロジェクトでは、System.Text.Jsonシリアル化オプションをどのように指定して、Pascalケースのプロパティをキャメルケースに、またはその逆に自動的にシリアル化/非シリアル化しますか?

次のようなPascal Caseプロパティを持つモデルがあるとします。

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

そして、System.Text.Jsonを使用してJSON文字列をPersonクラスのタイプに逆シリアル化するコード:

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Deserialize<Person>(json);

JsonPropertyNameが次のような各プロパティで使用されない限り、正常に逆シリアル化されません。

public class Person
{
    [JsonPropertyName("firstname")
    public string Firstname { get; set; }
    [JsonPropertyName("lastname")
    public string Lastname { get; set; }
}

で次のことを試しましたstartup.csが、それでもまだ必要であるという点で役に立ちませんでしたJsonPropertyName

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
});

// also the following given it's a Web API project

services.AddControllers().AddJsonOptions(options => {
    options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase;
    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

新しいSystem.Text.Json名前空間を使用して、ASP.NET Core 3.0でCamel Caseのシリアライズ/デシリアライズをどのように設定できますか?

ありがとう!

回答:


25

AddJsonOptions()configのでしょうSystem.Text.JsonMVCのためにのみ。JsonSerializer独自のコードで使用したい場合は、それに構成を渡す必要があります。

var options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var person = JsonSerializer.Parse<Person>(json, options);

System.Text.Jsonを使用してプロジェクト/アプリケーション全体のシリアル化オプションを指定する方法はありませんか?これは、System.Text.Json
Alexander Staroselskyの

私はそうは思いません。設定を渡す必要があります
Kahbazi


11

startup.cs

// keeps the casing to that of the model when serializing to json (default is converting to camelCase)
services.AddMvc()
    .AddJsonOptions(options => options.JsonSerializerOptions.PropertyNamingPolicy = null); 

つまり、newtonsoft.jsonをインポートする必要はありません。

の他の唯一のオプションはoptions.JsonSerializerOptions.PropertyNamingPolicyですJsonNamingPolicy.CamelCaseJsonNamingPolicysnake_caseやPascalCaseなどの他の命名ポリシーオプションはないようです。


これでうまくいきました。FTR、これまではサービスに.AddMvc()がありませんでした。追加するだけなので、AddJsonOptionsを追加できます。サーバーとクライアントのシリアライゼーションの問題はすべて解消されました...
Mark

10

使用できますPropertyNameCaseInsensitive。これをパラメータとしてデシリアライザに渡す必要があります。

var json = "{\"firstname\":\"John\",\"lastname\":\"Smith\"}";
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var person = JsonSerializer.Deserialize<Person>(json, options);

これ(ドキュメントから):

逆シリアル化中にプロパティの名前で大文字と小文字を区別しない比較を使用するかどうかを決定する値を取得または設定します。デフォルト値はfalseです。

したがって、キャメルケースやパスカルケースは指定しませんが、大文字と小文字を区別しない比較を使用します。これが要件を満たしているかどうかは不明です。


注:このアプリをコンソールアプリで広く設定することはできませんでした。以下のように述べKahbaziの答え services.AddMvc().AddJsonOptionsservices.AddControllers().AddJsonOptions(つまりは、例えば、コンソールアプリの広いJSON設定アプリケーションを設定しません)のみMVCとWEBAPIコントローラのJSONを設定します。以下は、コントローラーエンドポイントを介して渡されるJsonのSystem.Text.Jsonのみを構成します。

services.AddControllers()
        .AddJsonOptions(options => {
            options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
         }); 

6

CamelCaseのシリアル化が必要な場合は、Startup.csで次のコードを使用します(例:firstName)

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        });

PascalCaseのシリアル化が必要な場合は、Startup.csで次のコードを使用します(例:FirstName)。

services.AddControllers()
        .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy= null;
        );

4

以前のJsonシリアライザー実装を使用できるようにするMicrosoft.AspNetCore.Mvc.NewtonsoftJson Nuget Packageをインストールすることで、アプリケーション全体に設定できます。

services.AddControllers()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });

ポケへのクレジット、答えはここにあります: IMvcBuilder AddJsonOptionsは.Net Core 3.0のどこに行きましたか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.