1. ホーム
  2. .net

[解決済み] .NETでjsonのキーが小文字であることを確認する

2022-10-08 05:42:39

質問

.NETでJSONを使用して、キーが小文字で送信されることを保証する簡単な方法はありますか?

今のところ、私はnewtonsoftのJson.NETライブラリを使用しており、単に

string loginRequest = JsonConvert.SerializeObject(auth);

この場合 auth は単に次のオブジェクトです。

public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}

この結果

{"Username":"Mark","ApiToken":"xyzABC1234"}

を確実にする方法はありますか? usernameapitoken のキーは小文字で表示されますか?

単純に String.ToLower() の値は usernameapitoken は大文字と小文字が混在しています。

私はこれをプログラム的に行い、JSON文字列を手動で作成できることに気づきましたが、私は約20のJSONデータ文字列にこれを必要とし、私はいくつかの時間を節約することができるかどうかを見ています。キー作成に小文字を強制することができる、すでに構築されたライブラリがあるかどうか疑問に思っています。

どのように解決するのですか?

カスタムのコントラクトリゾルバを作成することができます。以下のコントラクトリゾルバーは、すべてのキーを小文字に変換します。

public class LowercaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return propertyName.ToLower();
    }
}

使用方法

var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings);

でウィル結果。

{"username":"Mark","apitoken":"xyzABC1234"}


常にシリアライズを行う場合は LowercaseContractResolver を使用してシリアライズする場合、繰り返しを避けるためにクラスでそれをラップすることを検討してください。

public class LowercaseJsonSerializer
{
    private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        ContractResolver = new LowercaseContractResolver()
    };

    public static string SerializeObject(object o)
    {
        return JsonConvert.SerializeObject(o, Formatting.Indented, Settings);
    }

    public class LowercaseContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName)
        {
            return propertyName.ToLower();
        }
    }
}

は、このように使うことができます。

var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" });
// { "foo": "bar" }


ASP.NET MVC4 / ウェブAPI

ASP.NET MVC4 / WebAPI を使用している場合、ASP.NET MVC4 / WebAPI で使用するために必要な CamelCasePropertyNamesContractResolver がデフォルトで含まれているNewtonsoft.Jsonライブラリから取得できます。