gpt4 book ai didi

c# - asp5 IConfigurationRoot 获取json数组

转载 作者:可可西里 更新时间:2023-11-01 08:51:47 25 4
gpt4 key购买 nike

我正在尝试向要部署在 Azure 上的 asp 5 mvc 6 web 应用程序(“rc1-final”库)提供一些额外的配置数据。此附加数据的一部分由 json 文件中的数据数组组成。我可以将这个 json 文件添加到我的配置中,并且在调试时如果我观察配置对象,我可以浏览到提供程序条目并看到它确实联系了我正在寻找的数据数组。

但是,尝试 Configuration["extraData"] 会产生 null(因为该属性的“值”为 null,即使它显然包含元素数组。

我可以毫无问题地访问存储在 json 配置中的单个值(例如我的数据库连接字符串和其他值。)似乎不支持数组格式的 json 数据?

请参阅以下示例 json 文件(根据 jsonlint 进行验证,对我来说似乎没问题)...

//extraData.json
{
"ExtraData": [
{
"Id": 1,
"Description": "The first identifier"
},
{
"Id": 2,
"Description": "The second identifier"
},
{
"Id": 3,
"Description": "The third identifier"
}
]
}

...以及以下示例 Startup.cs...

//Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Data.Entity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;
using System.IO;
using Microsoft.AspNet.Authentication.Cookies;
using System.Net;


namespace MyProj {
public class Startup {
public static IConfigurationRoot Configuration;

public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile("extraData.json")
.AddEnvironmentVariables();

Configuration = builder.Build();
}

public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
MyDbSeed seed,
ILoggerFactory logging) {

dynamic xData = JObject.Parse("ExtraData"); //VALUE IS NULL, THROWS EX
var myList = JsonConvert
.DeserializeObject<List<MyID>>(
xData.ExtraData.ToString()
);
//Do something important with this list
}

public static void Main(string[] args) => WebApplication.Run<Startup>(args);
}

class MyID {
public int ID { get; set; }
public string Description { get; set; }
}
}

我一直不得不做的事情(这看起来很老套,特别是考虑到现在可用的方便的配置系统)......

dynamic xData = JObject.Parse(
File.OpenText(
env.MapPath(
@"..\extraData.json"
)
).ReadToEnd()
);
var xList = JsonConvert
.DeserializeObject<List<MyID>>(
xData.ExtraData.ToString()
);
//Do something important with the list, eg...
var o = new MyClass(xList);

我也不确定 azure 是否支持像这样执行文件 io。

我发现这个资源表明支持数组/IEnum,但它只是使用内存中提供程序...
http://github.com/aspnet/Configuration/blob/dev/test/Microsoft.Extensions.Configuration.Binder.Test/ConfigurationCollectionBindingTests.cs

此资源是来自 MS 的文档...
http://docs.asp.net/en/latest/fundamentals/configuration.html

自发布以来搜索时出现的一些相关问题(不一定与我的问题 1:1 相关,但可能对其他搜索有用)
How to use ConfigurationBinder in Configure method of startup.cs
Retrieve sections from config.json in ASP.NET 5
ASP.NET 5 (vNext) - Getting a Configuration Setting

最佳答案

我们现在可以将 GetSectionGetChildren 和一些 LINQ 一起使用。

// appsettings.json
{
"SomeArray": [
"Foo",
"Bar",
"Baz"
]
}

// Startup.cs
var someArray = configuration
.GetSection("SomeArray")
.GetChildren()
.Select(x => x.Value)
.ToArray();

Configuration repository's ArrayTest 中也有演示.

关于c# - asp5 IConfigurationRoot 获取json数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34082927/

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