Использование System.Text.Json для сериализации IConfiguration обратно в JsonC#

Место общения программистов C#
Anonymous
Использование System.Text.Json для сериализации IConfiguration обратно в Json

Сообщение Anonymous »

Я сохраняю некоторые IConfiguration в виде json в своей базе данных sqlserver, чтобы затем привязать их к некоторым уже созданным классам, чтобы обеспечить динамические настройки.
В какой-то момент я могу измениться привязанные свойства новые во время выполнения, а затем обновляют базу данных. Дело в том, что когда мне нужно, у класса может быть больше свойств, которые не должны быть привязаны и не должны быть сериализованы. Поэтому я сохраняю IConfiguration как свойство моего класса. Другая причина, по которой я использую этот подход, заключается в том, что мне нужно создать экземпляры других дочерних классов из класса, который загрузил конфигурации, и сохранить их в базе данных, когда я это сделаю.
Дело в том, что что когда я сериализую IConfiguration, я получаю только пустую строку json типа "{}".
Полагаю, я мог бы проделать некоторые махинации, используя .AsEnumerable(), но нет ли лучшего способа?
Мой пример кода будет выглядеть примерно так

Код: Выделить всё

public class ConfigurableClass
{

public int ChildrenCount { get; set; } = 1069;
public bool IsFast { get; set; } = false;
public bool HasChildren { get; set; } = false;

public int Id { get; }

public ConfigurableClass(int id) { Id = id; }
}

static void Main(string[] args)
{

IEnumerable configs = SqlConfigLoader.LoadConfig();

foreach (var str in configs)
{
Console.WriteLine("Parsing new Config:");

var builder = new ConfigurationBuilder();

IConfiguration cfg = builder.AddJsonStream(new MemoryStream(Encoding.Default.GetBytes(str)))
.Build();

var stepExample = new ConfigurableClass(9);

cfg.Bind(stepExample);

//do work with the class that might change the value of binded properties

var updatedCfg = cfg;

Console.WriteLine(JsonSerializer.Serialize(updatedCfg));

Console.WriteLine();
}

Console.ReadLine();
}
Изменить
Я также попробовал другой подход, преобразовав IConfiguration во вложенный словарь, подобный этому

Код: Выделить всё

ublic static class IConfigurationExtensions
{
public static Dictionary ToNestedDicionary(this IConfiguration configuration)
{
var result = new Dictionary();
var children = configuration.GetChildren();
if (children.Any())
foreach (var child in children)
result.Add(child.Key, child.ToNestedDicionary());
else
if(configuration is IConfigurationSection section)
result.Add(section.Key, section.Get(typeof(object)));

return result;
}
}
Но я теряю неявный тип данного JsonElement:
если я сериализую результирующий словарь, я получу что-то вроде «Свойство»: «True» вместо «Собственность»: true

Подробнее здесь: https://stackoverflow.com/questions/627 ... ck-to-json

Вернуться в «C#»