ho la seguente stringa JSON:Json.NET deserializzare o serializzare JSON proprietà di stringa e della mappa a diversi nomi di proprietà definite in fase di esecuzione
{
"values": {
"details": {
"property1": "94",
"property2": "47",
"property3": "32",
"property4": 1
},
count: 4
}
}
Ho intenzione di mappare questo per il seguente modello:
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; }
}
voglio essere in grado di mappare i questi nomi di proprietà di nomi diversi in fase di esecuzione, quando la deserializzazione questa stringa JSON in questo modo:
JsonConvert.DeserializeObject<RootObject>(jsonString);
Ad esempio, nel processo di deserializzazione, voglio deserializzare il nome di "proprietà1" in "differen_property_name1" o "differen_property_name2" o "differen_property_name3". Perché ho scelto il nuovo nome in fase di esecuzione (il nuovo nome a cui cambierà il nome "proprietà1" a), non posso utilizzare la soluzione con JsonPropertyAttribute, come suggerito qui:
.NET NewtonSoft JSON deserialize map to a different property name
Una delle risposte della domanda precedente (la risposta di Jack) utilizza l'ereditarietà di DefaultContractResolver ma in quel caso non sembra funzionare.
Aggiornamento
Più tardi, avevo bisogno di serializzare l'oggetto che ho ricevuto dal deserializzazione e mappare le proprietà a diversi nomi di proprietà, definiti in fase di esecuzione. Ho usato lo stesso metodo di Brian ha proposto di fare la serializzazione:
ho usato il dizionario per mappare i miei nuovi nomi di proprietà:
var map = new Dictionary<Type, Dictionary<string, string>>
{
{
typeof(Details),
new Dictionary<string, string>
{
{"property1", "myNewPropertyName1"},
{"property2", "myNewPropertyName2"},
{"property3", "myNewPropertyName3"},
{"property4", "myNewPropertyName4"}
}
}
};
e poi ho usato DynamicMappingResolver di Brian per serializzare l'oggetto in questo modo:
var settings = new JsonSerializerSettings
{
ContractResolver = new DynamicMappingResolver(map)
};
var root = JsonConvert.SerializeObject(myObjectInstance, settings);
Perché voglio decidere in fase di esecuzione che il nuovo nome voglio dare alla proprietà e con JsonPropertyAttribute è necessario utilizzare un nome di "hard coded". –
Un modo (anche se potrebbe essere brutto) sarebbe deserializzare prima il JSON, quindi mappare l'oggetto deserializzato all'oggetto con i nuovi nomi. Ci può essere un modo più elegante, però. – Tim
@Tim, in che modo eseguire il mapping dell'oggetto deserializzato a un oggetto con i nuovi nomi quando è necessario definire i nuovi nomi in fase di runtime? –