.NETでJSONキーが小文字であることを確認する


103

.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"}

usernameおよびapitokenキーが小文字として渡されるようにする方法はありますか?

String.ToLower()の値は大文字と小文字が混在しusernameapitokenいるため、もちろん単純に実行する必要はありません。

プログラムでこれを実行し、JSON文字列を手動で作成できることはわかっていますが、約20ほどのJSONデータ文字列が必要なので、時間を節約できるかどうかを確認しています。鍵を作成するために小文字を強制できるライブラリがすでに構築されているかどうか疑問に思っています。


たぶん、jsonシリアライゼーションlibは、プロパティのjsonシリアライズ名を変更するために使用できる、ある種のシリアライゼーション属性を提供しますか?
tdammers

@tdammers、ありがとう、私はそれを行う何かを見つけようとしていますが、これまでのところ失敗しています。ここの誰かが私にそれを指摘することを願っています。
マーク

1
これは、プロパティが1つの単語で構成される場合に役立ちます。
リポタム

ええと。私は反対の問題を抱えています...また、「ユーザー名」は大文字と小文字が混在していると言っているのはおかしいです。「UserName」ですか?
BrainSlugs83

単純に大文字と小文字が混在している必要がある値だけが、私が触れなければならないものでした。価値はそのままにします。
マーク

回答:


176

このためのカスタム契約リゾルバーを作成できます。次のコントラクトリゾルバーは、すべてのキーを小文字に変換します。

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);

Wilの結果:

{"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 / WebAPI

ASP.NET MVC4 / WebAPIを使用している場合はCamelCasePropertyNamesContractResolver、デフォルトで含まれているNewtonsoft.Jsonライブラリのを使用できます。


これを逆に行う合理的な方法はありますか?逆シリアル化のために?
Shaun Rowan

1
@Anzeo私はそれを自分でやろうとしたことはありませんし、ドキュメントにそのことに関する情報はありませんでした。解決策は、JsonConvert.SerializeObjectを独自のクラスでラップすることです。私のアップデートを見てください。
alexn

3
例外を指定したい場合、このカスタム契約リゾルバーはJsonProperty属性を考慮しないようです...たとえば、[JsonProperty( "alternateName")]が小文字のままになるか、それを行う別の方法がありますか?
rekna 2012

2
を指摘するための+1 CamelCasePropertyNamesContractResolver。今私System.Net.Http.Formatting.JsonContractResolverはWebAPIのデフォルトであり、このクラスは内部です。JsonContractResolverキャメルケースで書き直してしまう。誰かがこれを公開していると報告しましたaspnetwebstack.codeplex.com/workitem/228
CallMeLaNN

10
CamelCasePropertyNamesContratResolverプロパティを小文字に変換せず、最初の文字だけを変換します。
ToXinE

23
protected void Application_Start() {
    JsonConfig.Configure();   
}

public static class JsonConfig
{
    public static void Configure(){
        var formatters = GlobalConfiguration.Configuration.Formatters;
        var jsonFormatter = formatters.JsonFormatter;
        var settings = jsonFormatter.SerializerSettings;

        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

10

Json.NET 9.0.1以降では、すべてのプロパティ名がカスタムを使用して小文字に変換されていることを確認することが可能ですNamingStrategy。このクラスは、プロパティ名をコントラクトリゾルバーから個別に設定できる軽量オブジェクトにアルゴリズムで再マッピングするロジックを抽出しDefaultContractResolver.NamingStrategyます。そうすることで、カスタムContractResolverを作成する必要がなくなるため、独自のコントラクトリゾルバーがすでにあるフレームワークに統合するのが簡単になる場合があります。

LowercaseNamingStrategy次のように定義します。

public class LowercaseNamingStrategy : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLowerInvariant();
    }
}

次に、次のようにシリアル化します。

var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
};
string loginRequest = JsonConvert.SerializeObject(auth, settings);

ノート -


8

「JsonProperty」を使用できます。

使用法:

public class Authority
{
    [JsonProperty("userName")] // or [JsonProperty("username")]
    public string Username { get; set; }
    [JsonProperty("apiToken")] // or [JsonProperty("apitoken")]
    public string ApiToken { get; set; }
}

var json  = JsonConvert.SerializeObject(authority);

0

私にとっては、他のいくつかの回答の組み合わせを使用して、これで終わりました

        return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        });

自分で作成するつもりがなかったので、私が探していたものの解決策に近かった

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