gpt4 book ai didi

asp.net - 如何将 IConfigurationRoot 或 IConfigurationSection 转换为 JObject/JSON

转载 作者:行者123 更新时间:2023-12-03 18:31:43 25 4
gpt4 key购买 nike

我的 Program.cs 中有以下代码:

var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("clientsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"clientsettings.{host.GetSetting("environment")}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();

我想将构建我的配置的结果转换为 JObject\Json 以发送到客户端。我该怎么做?
我不想为我的设置创建自定义类。

我的回答: merge
public static JObject GetSettingsObject(string environmentName)
{
object[] fileNames = { "settings.json", $"settings.{environmentName}.json" };


var jObjects = new List<object>();

foreach (var fileName in fileNames)
{
var fPath = Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar + fileName;
if (!File.Exists(fPath))
continue;

using (var file = new StreamReader(fPath, Encoding.UTF8))
jObjects.Add(JsonConvert.DeserializeObject(file.ReadToEnd()));
}


if (jObjects.Count == 0)
throw new InvalidOperationException();


var result = (JObject)jObjects[0];
for (var i = 1; i < jObjects.Count; i++)
result.Merge(jObjects[i], new JsonMergeSettings
{
MergeArrayHandling = MergeArrayHandling.Merge
});

return result;
}

最佳答案

由于配置实际上只是一个键值存储,其中键具有某种格式来表示路径,因此将其序列化回 JSON 并不是那么简单。

您可以做的是递归遍历配置子项并将其值写入 JObject .这看起来像这样:

public JToken Serialize(IConfiguration config)
{
JObject obj = new JObject();
foreach (var child in config.GetChildren())
{
obj.Add(child.Key, Serialize(child));
}

if (!obj.HasValues && config is IConfigurationSection section)
return new JValue(section.Value);

return obj;
}

请注意,这对输出的外观非常有限。例如,数字或 bool 值(JSON 中的有效类型)将表示为字符串。由于数组是通过数字键路径表示的(例如 key:0key:1 ),您将获得作为索引字符串的属性名称。

让我们以下面的 JSON 为例:
{
"foo": "bar",
"bar": {
"a": "string",
"b": 123,
"c": true
},
"baz": [
{ "x": 1, "y": 2 },
{ "x": 3, "y": 4 }
]
}

这将通过以下关键路径在配置中表示:
"foo"      -> "bar"
"bar:a" -> "string"
"bar:b" -> "123"
"bar:c" -> "true"
"baz:0:x" -> "1"
"baz:0:y" -> "2"
"baz:1:x" -> "3"
"baz:1:y" -> "4"

因此,上述 Serialize 的结果 JSON方法如下所示:
{
"foo": "bar",
"bar": {
"a": "string",
"b": "123",
"c": "true"
},
"baz": {
"0": { "x": "1", "y": "2" },
"1": { "x": "3", "y": "4" }
}
}

因此,这将不允许您取回原始表示。话虽如此,当再次使用 Microsoft.Extensions.Configuration.Json 读取结果 JSON 时,那么它将产生相同的配置对象。因此,您可以使用它来将配置存储为 JSON。

如果你想要比这更漂亮的东西,你将不得不添加逻辑来检测数组和非字符串类型,因为这两者都不是配置框架的概念。

I want to merge appsettings.json and appsettings.{host.GetSetting("environment")}.json to one object [and send that to the client]



请记住,特定于环境的配置文件通常包含不应离开机器的 secret 。对于环境变量尤其如此。如果要传输配置值,请确保在构建配置时不要包含环境变量。

关于asp.net - 如何将 IConfigurationRoot 或 IConfigurationSection 转换为 JObject/JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com