J'ai la chaîne JSON suivante qui est reçue d'une partie externe.
{
"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"
}
}
]
}
Mes cours de cartographie:
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; }
}
La question est que je n'aime pas le Attributes
nom de classe et les attributes
noms de champs dans la Team
classe. Au lieu de cela, je veux qu'il soit nommé TeamScore
et également supprimé _
des noms de champs et donne les noms appropriés.
JsonConvert.DeserializeObject<RootObject>(jsonText);
Je peux renommer Attributes
à TeamScore
, mais si je change le nom du champ ( attributes
dans la Team
classe), il ne sera pas désérialiser correctement et me donne null
. Comment puis-je surmonter cela?
Réponses:
Json.NET a un
JsonPropertyAttribute
qui vous permet de spécifier le nom d'une propriété JSON, donc votre code doit être:Documentation: Attributs de sérialisation
la source
Si vous souhaitez utiliser le mappage dynamique et que vous ne voulez pas encombrer votre modèle avec des attributs, cette approche a fonctionné pour moi
Usage:
Logique:
la source
Ajout à la solution Jacks. J'ai besoin de désérialiser en utilisant JsonProperty et Serialize tout en ignorant JsonProperty (ou vice versa). ReflectionHelper et Attribute Helper ne sont que des classes d'assistance qui obtiennent une liste de propriétés ou d'attributs pour une propriété. Je peux inclure si quelqu'un s'en soucie réellement. En utilisant l'exemple ci-dessous, vous pouvez sérialiser le viewmodel et obtenir "Amount" même si le JsonProperty est "RecurringPrice".
Usage:
Modèle:
la source
CreateProperty
dans ContractResolver. Là, appelez la base:var jsonProperty = base.CreateProperty(memberInfo, memberSerialization);
puis définissezjsonProperty.PropertyName = memberInfo.Name;
. Enfin,return jsonProperty;
c'est tout ce dont vous avez besoin.En développant la réponse de Rentering.com , dans les scénarios où un graphique entier de nombreux types doit être pris en charge et que vous recherchez une solution fortement typée, cette classe peut vous aider, voir utilisation (fluide) ci-dessous. Il fonctionne comme une liste noire ou une liste blanche par type. Un type ne peut pas être les deux ( Gist - contient également une liste globale d'ignorance).
Usage:
la source
J'utilise les attributs JsonProperty lors de la sérialisation mais je les ignore lors de la désérialisation en utilisant ceci
ContractResolver
:Le
ContractResolver
définit simplement chaque propriété sur le nom de la propriété de classe (simplifié à partir de la solution de Shimmy). Usage:la source