.NET NewtonSoft JSON deserialize map to a different property name
Json.NET has a JsonPropertyAttribute
which allows you to specify the name of a JSON property, so your code should be:
public class TeamScore{ [JsonProperty("eighty_min_score")] public string EightyMinScore { get; set; } [JsonProperty("home_or_away")] public string HomeOrAway { get; set; } [JsonProperty("score ")] public string Score { get; set; } [JsonProperty("team_id")] public string TeamId { get; set; }}public class Team{ public string v1 { get; set; } [JsonProperty("attributes")] public TeamScore TeamScores { get; set; }}public class RootObject{ public List<Team> Team { get; set; }}
Documentation: Serialization Attributes
If you'd like to use dynamic mapping, and don't want to clutter up your model with attributes, this approach worked for me
Usage:
var settings = new JsonSerializerSettings();settings.DateFormatString = "YYYY-MM-DD";settings.ContractResolver = new CustomContractResolver();this.DataContext = JsonConvert.DeserializeObject<CountResponse>(jsonString, settings);
Logic:
public class CustomContractResolver : DefaultContractResolver{ private Dictionary<string, string> PropertyMappings { get; set; } public CustomContractResolver() { this.PropertyMappings = new Dictionary<string, string> { {"Meta", "meta"}, {"LastUpdated", "last_updated"}, {"Disclaimer", "disclaimer"}, {"License", "license"}, {"CountResults", "results"}, {"Term", "term"}, {"Count", "count"}, }; } protected override string ResolvePropertyName(string propertyName) { string resolvedName = null; var resolved = this.PropertyMappings.TryGetValue(propertyName, out resolvedName); return (resolved) ? resolvedName : base.ResolvePropertyName(propertyName); }}
Adding to Jacks solution. I need to Deserialize using the JsonProperty and Serialize while ignoring the JsonProperty (or vice versa). ReflectionHelper and Attribute Helper are just helper classes that get a list of properties or attributes for a property. I can include if anyone actually cares. Using the example below you can serialize the viewmodel and get "Amount" even though the JsonProperty is "RecurringPrice".
/// <summary> /// Ignore the Json Property attribute. This is usefule when you want to serialize or deserialize differently and not /// let the JsonProperty control everything. /// </summary> /// <typeparam name="T"></typeparam> public class IgnoreJsonPropertyResolver<T> : DefaultContractResolver { private Dictionary<string, string> PropertyMappings { get; set; } public IgnoreJsonPropertyResolver() { this.PropertyMappings = new Dictionary<string, string>(); var properties = ReflectionHelper<T>.GetGetProperties(false)(); foreach (var propertyInfo in properties) { var jsonProperty = AttributeHelper.GetAttribute<JsonPropertyAttribute>(propertyInfo); if (jsonProperty != null) { PropertyMappings.Add(jsonProperty.PropertyName, propertyInfo.Name); } } } protected override string ResolvePropertyName(string propertyName) { string resolvedName = null; var resolved = this.PropertyMappings.TryGetValue(propertyName, out resolvedName); return (resolved) ? resolvedName : base.ResolvePropertyName(propertyName); } }
Usage:
var settings = new JsonSerializerSettings(); settings.DateFormatString = "YYYY-MM-DD"; settings.ContractResolver = new IgnoreJsonPropertyResolver<PlanViewModel>(); var model = new PlanViewModel() {Amount = 100}; var strModel = JsonConvert.SerializeObject(model,settings);
Model:
public class PlanViewModel{ /// <summary> /// The customer is charged an amount over an interval for the subscription. /// </summary> [JsonProperty(PropertyName = "RecurringPrice")] public double Amount { get; set; } /// <summary> /// Indicates the number of intervals between each billing. If interval=2, the customer would be billed every two /// months or years depending on the value for interval_unit. /// </summary> public int Interval { get; set; } = 1; /// <summary> /// Number of free trial days that can be granted when a customer is subscribed to this plan. /// </summary> public int TrialPeriod { get; set; } = 30; /// <summary> /// This indicates a one-time fee charged upfront while creating a subscription for this plan. /// </summary> [JsonProperty(PropertyName = "SetupFee")] public double SetupAmount { get; set; } = 0; /// <summary> /// String representing the type id, usually a lookup value, for the record. /// </summary> [JsonProperty(PropertyName = "TypeId")] public string Type { get; set; } /// <summary> /// Billing Frequency /// </summary> [JsonProperty(PropertyName = "BillingFrequency")] public string Period { get; set; } /// <summary> /// String representing the type id, usually a lookup value, for the record. /// </summary> [JsonProperty(PropertyName = "PlanUseType")] public string Purpose { get; set; }}