Ich habe folgende JSON-Zeichenfolge, die von einer externen Partei empfangen wird.
{
"team":[
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"home",
"score":"22",
"team_id":"500"
}
},
{
"v1":"",
"attributes":{
"eighty_min_score":"",
"home_or_away":"away",
"score":"30",
"team_id":"600"
}
}
]
}
Meine Mapping-Klassen:
public class Attributes
{
public string eighty_min_score { get; set; }
public string home_or_away { get; set; }
public string score { get; set; }
public string team_id { get; set; }
}
public class Team
{
public string v1 { get; set; }
public Attributes attributes { get; set; }
}
public class RootObject
{
public List<Team> team { get; set; }
}
Die Frage ist, dass mir der Attributes
Klassenname und die attributes
Feldnamen in der Team
Klasse nicht gefallen . Stattdessen möchte ich, dass es benannt wird TeamScore
und auch _
aus den Feldnamen entfernt und Eigennamen angegeben werden.
JsonConvert.DeserializeObject<RootObject>(jsonText);
Ich kann umbenennen Attributes
in TeamScore
, aber wenn ich den Feldnamen ( attributes
in der Team
Klasse) ändere , wird er nicht richtig deserialisiert und gibt mir null
. Wie kann ich das überwinden?
Antworten:
Json.NET hat eine ,
JsonPropertyAttribute
die Sie den Namen einer JSON - Eigenschaft angeben kann, so sollten Sie den Code sein:Dokumentation: Serialisierungsattribute
quelle
Wenn Sie dynamisches Mapping verwenden möchten und Ihr Modell nicht mit Attributen überladen möchten, hat dieser Ansatz für mich funktioniert
Verwendungszweck:
Logik:
quelle
Hinzufügen zu Jacks Lösung. Ich muss mit JsonProperty und Serialize deserialisieren, während ich JsonProperty ignoriere (oder umgekehrt). ReflectionHelper und Attribute Helper sind nur Hilfsklassen, die eine Liste von Eigenschaften oder Attributen für eine Eigenschaft abrufen. Ich kann einschließen, wenn es jemanden wirklich interessiert. Mit dem folgenden Beispiel können Sie das Ansichtsmodell serialisieren und "Amount" abrufen, obwohl die JsonProperty "RecurringPrice" lautet.
Verwendungszweck:
Modell:
quelle
CreateProperty
den ContractResolver zu überschreiben . Dort ruf die Basis an:var jsonProperty = base.CreateProperty(memberInfo, memberSerialization);
und setze dannjsonProperty.PropertyName = memberInfo.Name;
. Endlich istreturn jsonProperty;
das alles was du brauchst.Wenn Sie die Antwort von Rentering.com in Szenarien erweitern, in denen ein ganzes Diagramm mit vielen Typen erstellt werden muss und Sie nach einer stark typisierten Lösung suchen, kann diese Klasse helfen, siehe Verwendung (fließend) unten. Es fungiert entweder als schwarze Liste oder als weiße Liste pro Typ. Ein Typ kann nicht beides sein ( Gist - enthält auch eine globale Ignorierliste).
Verwendungszweck:
quelle
Ich verwende JsonProperty-Attribute beim Serialisieren, ignoriere sie jedoch beim Deserialisieren mit den folgenden Attributen
ContractResolver
:Mit
ContractResolver
just setzt jede Eigenschaft auf den Namen der Klasseneigenschaft zurück (vereinfacht aus Shimmys Lösung). Verwendung:quelle