Json.NET deserialisiert oder serialisiert die Eigenschaften von json-Strings und ordnet sie verschiedenen Eigenschaftsnamen zu, die zur Laufzeit definiert wurden.

Ich habe die folgende JSON-Zeichenfolge:

{
    "values": {
        "details": {
            "property1": "94",
            "property2": "47",
            "property3": "32",
            "property4": 1
        },
        count: 4
    }
}     

Ich werde dies dem folgenden Modell zuordnen:

public class Details
{
    public string property1 { get; set; }
    public string property2 { get; set; }
    public string property3 { get; set; }
    public int property4 { get; set; }
}

public class Values
{
    public Details details { get; set; }
    public int count { get; set; }
}

public class RootObject
{
    public Values values { get; set; }
}

Ich möchte in der Lage sein, diese Eigenschaftsnamen zur Laufzeit verschiedenen Namen zuzuordnen, wenn diese JSON-Zeichenfolge wie folgt deserialisiert wird:

JsonConvert.DeserializeObject<RootObject>(jsonString);

Zum Beispiel möchte ich im Deserialisierungsprozess den Namen von "property1" zu "differen_property_name1" oder "differen_property_name2" oder "differen_property_name3" deserialisieren. Weil Ich wähle den neuen Namen zur Laufzeit (der neue Name, in den ich den Namen "property1" ändern werde), ich kann die Lösung mit JsonPropertyAttribute nicht verwenden, wie hier vorgeschlagen:

.NET NewtonSoft JSON deserialisiert die Zuordnung zu einem anderen Eigenschaftsnamen

Eine der Antworten der obigen Frage (Jacks Antwort) verwendet die Vererbung von DefaultContractResolver, aber in diesem Fall scheint sie nicht zu funktionieren.

Aktualisiere

päter musste ich das Objekt, das ich aus der Deserialisierung erhalten hatte, serialisieren und die Eigenschaften verschiedenen Eigenschaftsnamen zuordnen, die zur Laufzeit definiert wurden. Ich habe die gleiche Methode verwendet, die Brian für die Serialisierung vorgeschlagen hat:

Ich habe das Wörterbuch verwendet, um meine neuen Eigenschaftsnamen zuzuordnen:

var map = new Dictionary<Type, Dictionary<string, string>>
{
    { 
        typeof(Details), 
        new Dictionary<string, string>
        {
            {"property1", "myNewPropertyName1"},
            {"property2", "myNewPropertyName2"},
            {"property3", "myNewPropertyName3"},
            {"property4", "myNewPropertyName4"}
        }
    }
};    

und dann habe ich Brians DynamicMappingResolver verwendet, um das Objekt wie folgt zu serialisieren:

var settings = new JsonSerializerSettings
{
    ContractResolver = new DynamicMappingResolver(map)
};

var root = JsonConvert.SerializeObject(myObjectInstance, settings);            

Antworten auf die Frage(8)

Ihre Antwort auf die Frage