serialize - serialisierung c#




Bei der Serialisierung von Wörterbüchern die Umhüllung beibehalten (3)

Das ist eine sehr nette Antwort. Aber warum überschreibe nicht einfach den ResolveDictionaryKey ?

class CamelCaseExceptDictionaryResolver : CamelCasePropertyNamesContractResolver
    {
        #region Overrides of DefaultContractResolver

        protected override string ResolveDictionaryKey(string dictionaryKey)
        {
            return dictionaryKey;
        }

        #endregion
    }

Ich habe ein Web-API-Projekt wie folgt konfiguriert:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

Ich möchte jedoch, dass Wörterbuchschlüsselgehäuse unverändert bleiben. Newtonsoft.Json es ein Attribut in Newtonsoft.Json ich einer Klasse Newtonsoft.Json kann, um Newtonsoft.Json , dass die Umhüllung während der Serialisierung unverändert bleiben soll?

public class SomeViewModel
{
    public Dictionary<string, string> Data { get; set; }    
}

Die ausgewählte Antwort ist perfekt, aber ich schätze, wenn ich dies schreibe, muss sich der Contract Resolver in etwas ändern, weil DictionaryKeyResolver nicht mehr existiert :)

public class CamelCaseExceptDictionaryKeysResolver : CamelCasePropertyNamesContractResolver
    {
        protected override JsonDictionaryContract CreateDictionaryContract(Type objectType)
        {
            JsonDictionaryContract contract = base.CreateDictionaryContract(objectType);
            contract.PropertyNameResolver = propertyName => propertyName;
            return contract;
        }
    }

Json.NET 9.0.1 führte die NamingStrategy -Klassenhierarchie ein, um diese Art von Problem zu NamingStrategy . Sie extrahiert die Logik für die algorithmische Neuzuordnung von Eigenschaftsnamen aus dem Vertragsauflösungsdienst in eine separate, leichtgewichtige Klasse, mit der gesteuert werden kann, ob Wörterbuchschlüssel , explizit angegebene Eigenschaftsnamen und Erweiterungsdatennamen (in 10.0.1 ) neu zugeordnet werden.

Wenn Sie DefaultContractResolver und NamingStrategy auf eine Instanz von CamelCaseNamingStrategy , können Sie JSON mit Camel-Eigenschaftsnamen und unmodifizierten Wörterbuchschlüsseln generieren:

var resolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy { ProcessDictionaryKeys = false, OverrideSpecifiedNames = true } };
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = resolver;

Anmerkungen:

  • Die aktuelle Implementierung von CamelCasePropertyNamesContractResolver außerdem an, dass .NET-Member mit explizit angegebenen Eigenschaftsnamen (z. B. solche, in denen JsonPropertyAttribute.PropertyName festgelegt wurde) ihre Namen neu zugeordnet werden sollten:

    public CamelCasePropertyNamesContractResolver()
    {
        NamingStrategy = new CamelCaseNamingStrategy
        {
            ProcessDictionaryKeys = true,
            OverrideSpecifiedNames = true
        };
    }
    

    Der obige resolver behält dieses Verhalten bei. Wenn Sie dies nicht möchten, setzen Sie OverrideSpecifiedNames = false .

  • Json.NET hat mehrere integrierte Benennungsstrategien, einschließlich:

    1. CamelCaseNamingStrategy . Eine Kamelfallbenennungsstrategie, die die Namen-Neuzuordnungslogik enthält, die zuvor in CamelCasePropertyNamesContractResolver eingebettet war.
    2. SnakeCaseNamingStrategy . Eine Schlangenfall- Benennungsstrategie.
    3. DefaultNamingStrategy . Die Standardbenennungsstrategie. Eigenschaftsnamen und Wörterbuchschlüssel sind unverändert.

    Oder Sie können Ihre eigenen erstellen, indem Sie von der abstrakten Basisklasse NamingStrategy .

  • Es ist zwar auch möglich, die NamingStrategy einer Instanz von CamelCasePropertyNamesContractResolver zu ändern, da letztere die Vertragsinformationen global über alle Instanzen jedes Typs verteilt , kann dies zu unerwarteten Nebenwirkungen führen, wenn Ihre Anwendung versucht, mehrere Instanzen von CamelCasePropertyNamesContractResolver . Mit DefaultContractResolver existiert kein solches Problem. DefaultContractResolver ist es sicherer, es zu verwenden, wenn eine Anpassung der Casing-Logik erforderlich ist.





json.net