36

Json.NETは、アドバタイズされた機能の1つとして「大文字と小文字を区別しないプロパティの逆シリアル化」をリストしています。指定されたプロパティの大文字と小文字を一致させる試みが最初に行われ、一致が見つからない場合は大文字と小文字を区別しない検索が実行されることを読みました。ただし、これはデフォルトの動作ではないようです。次の例を参照してください。

var result =
    JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
        "{key: 123, value: \"test value\"}"
    );

// result is equal to: default(KeyValuePair<int, string>)

プロパティの大文字と小文字が一致するようにJSON文字列が変更された場合(「Key」と「Value」と「key」と「value」)、すべて問題ありません。

var result =
    JsonConvert.DeserializeObject<KeyValuePair<int, string>>(
        "{Key: 123, Value: \"test value\"}"
    );

// result is equal to: new KeyValuePair<int, string>(123, "test value")

大文字と小文字を区別しない逆シリアル化を実行する方法はありますか?

4

3 に答える 3

30

それはバグです。

大文字と小文字を区別しないプロパティの逆シリアル化とは、Json.NETが「Key」という名前のJSONプロパティを.NETクラスの「Key」または「key」メンバーにマップできることを意味します。

バグは、KeyValuePairが独自のJsonConverterを必要とするが、大文字と小文字を区別しないマッピングを見逃していることです。

https://github.com/JamesNK/Newtonsoft.Json/blob/fe200fbaeb5bad3852812db1e964473e1f881d93/Src/Newtonsoft.Json/Converters/KeyValuePairConverter.cs

これをベースとして使用し、JSONを読み取るときに小文字の「key」と「value」をcaseステートメントに追加します。

于 2012-06-29T23:45:06.987 に答える
14

私が見つけた効率的な方法の1つは、StringComparerパラメーターでGetValueを使用することでした。

たとえば、

JObject contact;
String strName = contact.GetValue('Name');

大文字と小文字を区別せずに「Name」プロパティにアクセスしようとしています。次を使用できます。

JObject contact;
String strName = contact.GetValue("ObjType", StringComparison.InvariantCultureIgnoreCase);
于 2013-10-06T03:23:11.190 に答える
2

着信プロパティ名にカスタムコントラクトリゾルバーを使用できます。これにより、着信プロパティを、C#オブジェクトクラスのプロパティ形式に一致する適切な形式に変更できます。着信プロパティ名をタイトル大文字/小文字/大文字に変更する3つのカスタムコントラクトリゾルバーを作成しました。

public class TitleCaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        //Change the incoming property name into Title case
        var name = string.Concat(propertyName[0].ToString().ToUpper(), propertyName.Substring(1).ToLower());
        return base.ResolvePropertyName(name);
    }
}

public class LowerCaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        //Change the incoming property name into Lower case
        return base.ResolvePropertyName(propertyName.ToLower());
    }
}

public class UpperCaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        //Change the incoming property name into Upper case
        return base.ResolvePropertyName(propertyName.ToUpper());
    }
}

次に、新しいJsonSerializerSettingオブジェクトを作成し、カスタムコントラクトリゾルバーをプロパティContractResolverに配置します。次に、JsonSerializerSettingオブジェクトをJsonConvert.DeserializeObject(jsonString、jsonSerializerSetting)の2番目のパラメーターに追加します。

        var serializerSetting = new JsonSerializerSettings()
        {
            ContractResolver = new TitleCaseContractResolver()
        };
        var result = JsonConvert.DeserializeObject<YourType>(jsonString, serializerSetting);
于 2019-07-12T09:42:09.543 に答える