.NET NewtonSoft JSON deserialize map to a different property name .NET NewtonSoft JSON deserialize map to a different property name json json

.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; }}