Получение данных из appsettings.json - PullRequest
0 голосов
/ 25 августа 2018

Так что я действительно застрял на 2 дня. Я искал через stackoverflow и Google, следуя многим руководствам, но не помогло: /. Поэтому я пытаюсь извлечь данные из json-файла appsettings, так как я буду хранить там данные в виде моего стандартного файла настроек.

Я хочу прочитать массив json-> iv ', который называется мой раздел "Locations" и мой ключ "Location", где мои значения - это массив json. На данный момент в этом массиве есть только названия автомобильных компаний, а не реальные данные. Реальные данные - это пути к файлам.

Я использую vs2017 с .net core 2.0 или 2.1

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; set; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(config =>
        {
            config.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        });
    services.AddOptions();
    services.AddSingleton<IConfiguration>(Configuration);


}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddEnvironmentVariables()
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();

    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });

    Configuration = builder.Build();
}

Это мой стартап-класс.

"Locations": {
    "Location": [ "Ford", "BMW", "Fiat" ]
}, 

мой JSON.

namespace MediaCenter.Models
{
    public class Locations
    {
        public List<string> location { get; set; }
    }
}

Мой класс для него, так как я прочитал, что он необходим для .net core 2.0 для системы DI.

public IActionResult Settings()
{
    var array = _configuration.GetSection("Locations").GetSection("Location");
    var items = array.Value.AsEnumerable();
    return View();
}

данные моего контроллера.

Для записи, когда я делаю точку останова в "массиве переменных", я могу видеть в поставщиках и членах, что мои значения хранятся внутри, так что, я думаю, я не делаю правильный вызов массива? Во всяком случае, было бы очень полезно, если бы я получил хороший рабочий ответ, так как я застрял: (.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Для WebHost.CreateDefaultBuilder в Program.cs, нет необходимости использовать new ConfigurationBuilder(). Попробуйте варианты ниже:

Option1 Получить значение из IConfiguration

    public class OptionsController : Controller
{
    private readonly IConfiguration _configuration;

    public OptionsController(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    public IActionResult Index()
    {
        var locations = new Locations();
        _configuration.GetSection("Locations").Bind(locations);

        var items = locations.location.AsEnumerable();
        return View();
    }
}

Опции Настройка Options в Startup

  1. Startup.cs

            services.Configure<Locations>(Configuration.GetSection("Locations"));
    
  2. Использование в контроллере

    public class OptionsController : Controller
    {
    private readonly Locations _locations;
    public OptionsController(IOptions<Locations> options)
    {
        _locations = options.Value;
    }
    public IActionResult Index()
    {           
        var items2 = _locations;
        return View();
    }
     }
    

Исходный код

0 голосов
/ 25 августа 2018

Есть пара неправильных вещей.

  1. При запуске вам необходимо настроить Configuration в конструкторе, а не в ConfigureServices(services).
  2. Они хранятся как Children, поэтому вам нужно сделать GetChildren() в вашем разделе.

Вот что вам нужно изменить в Startup.cs

// Replace IConfiguration with IHostingEnvironment since we will build
// Our own configuration
public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddEnvironmentVariables()
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    // Set the new Configuration
    Configuration = builder.Build();
}

В вашем контроллере теперь вы можете использовать следующее:

public IActionResult Settings()
{
   var array = Configuration.GetSection("Locations:Location")
       .GetChildren()
       .Select(configSection => configSection.Value);
   return View();
} 

Редактировать

Проблема в том, что appsettings.json отформатирован неправильно.Все было настроено как дочерний элемент раздела Logging.Ниже приведен обновленный и правильный json, я добавил дополнительный }, и удалил } снизу.

 {
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "DBConnection": {
    "Host": "",
    "UserName": "",
    "Password": ""
  },

  "Locations": {
    "Location": [ "Ford", "BMW", "Fiat" ]
  },

  "VideoExtensions": {
    "Extensions": []
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...