Самый простой способ заставить все работать - изменить вашу модель следующим образом:
public class Preferences
{
public List<Dictionary<string, NotificationInfo>> Notifications { get; set; }
}
public class NotificationInfo
{
public int TargetIntId { get; set; }
public bool Digest { get; set; }
}
Имена событий из JSON станут ключами словаря в списке.
Fiddle: https://dotnetfiddle.net/P3yD3p
Однако эта модель может быть немного неудобной в использовании, как вы можете видеть из скрипки.На мой взгляд, лучший подход - сохранить исходную модель и использовать пользовательский JsonConverter
для обработки перевода.Вот код, который вам понадобится для конвертера:
public class NotificationsConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<NotificationInfo>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var array = JArray.Load(reader);
return array.Children<JObject>()
.SelectMany(jo => jo.Properties())
.Select(jp => new NotificationInfo
{
EventName = jp.Name,
TargetIntId = (int)jp.Value["TargetIntId"],
Digest = (bool)jp.Value["Digest"]
})
.ToList();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Чтобы использовать его, просто добавьте атрибут [JsonConverter]
к свойству Notifications
, например:
[JsonConverter(typeof(NotificationsConverter))]
public List<NotificationInfo> Notifications { get; set; }
Fiddle: https://dotnetfiddle.net/vkjXC0