ASP.NET Core Obtenha matriz Json usando a configuração ICon

167

Em appsettings.json

{
      "MyArray": [
          "str1",
          "str2",
          "str3"
      ]
}

Em Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     services.AddSingleton<IConfiguration>(Configuration);
}

Em HomeController

public class HomeController : Controller
{
    private readonly IConfiguration _config;
    public HomeController(IConfiguration config)
    {
        this._config = config;
    }

    public IActionResult Index()
    {
        return Json(_config.GetSection("MyArray"));
    }
}

Existem os meus códigos acima, fiquei nulo Como obter a matriz?

Máx.
fonte

Respostas:

102

Se você quiser escolher o valor do primeiro item, faça o seguinte:

var item0 = _config.GetSection("MyArray:0");

Se você quiser escolher o valor de toda a matriz, faça o seguinte:

IConfigurationSection myArraySection = _config.GetSection("MyArray");
var itemArray = myArraySection.AsEnumerable();

Idealmente, você deve considerar o uso de um padrão de opções sugerido pela documentação oficial. Isso lhe dará mais benefícios.

Sanket
fonte
23
Se você tiver uma variedade de objetos como "Clients": [ {..}, {..} ], você deve chamar Configuration.GetSection("Clients").GetChildren().
halllo
39
Se você tiver uma matriz de literais como "Clients": [ "", "", "" ], você deve chamar .GetSection("Clients").GetChildren().ToArray().Select(c => c.Value).ToArray().
halllo
6
Esta resposta produzirá 4 itens, sendo o primeiro a própria seção com um valor vazio. Está incorreto.
Giovanni Bassi
4
var clients = Configuration.GetSection("Clients").GetChildren() .Select(clientConfig => new Client { ClientId = clientConfig["ClientId"], ClientName = clientConfig["ClientName"], ... }) .ToArray();
Invoquei
1
Nenhuma dessas opções funciona para mim, pois o objeto está retornando nulo no ponto de "Clientes" usando o exemplo de hallo. Estou confiante de que o json está bem formado, pois trabalha com o deslocamento inserido na string ["item: 0: childItem"] no formato "Item": [{...}, {...}]
Clarence
281

Você pode instalar os dois pacotes NuGet a seguir:

Microsoft.Extensions.Configuration    
Microsoft.Extensions.Configuration.Binder

E então você terá a possibilidade de usar o seguinte método de extensão:

var myArray = _config.GetSection("MyArray").Get<string[]>();
Razvan Dumitru
fonte
13
Isso é muito mais direto do que as outras respostas.
jao
14
Esta é a melhor resposta de longe.
26918 Giovanni Bassi
14
No meu caso, o aplicativo da web Aspnet core 2.1, incluiu esses dois pacotes de pepitas. Portanto, foi apenas uma mudança de linha. Obrigado
Shibu Thannikkunnath
O mais simples!
Pablo Pablo
3
Ele também funciona com uma variedade de objetos, por exemplo _config.GetSection("AppUser").Get<AppUser[]>();
Giorgos Betsos 23/02
60

Adicione um nível no seu appsettings.json:

{
  "MySettings": {
    "MyArray": [
      "str1",
      "str2",
      "str3"
    ]
  }
}

Crie uma classe representando sua seção:

public class MySettings
{
     public List<string> MyArray {get; set;}
}

Na classe de inicialização do aplicativo, vincule seu modelo e injete-o no serviço de DI:

services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));

E no seu controlador, obtenha seus dados de configuração no serviço de DI:

public class HomeController : Controller
{
    private readonly List<string> _myArray;

    public HomeController(IOptions<MySettings> mySettings)
    {
        _myArray = mySettings.Value.MyArray;
    }

    public IActionResult Index()
    {
        return Json(_myArray);
    }
}

Você também pode armazenar todo o seu modelo de configuração em uma propriedade em seu controlador, se precisar de todos os dados:

public class HomeController : Controller
{
    private readonly MySettings _mySettings;

    public HomeController(IOptions<MySettings> mySettings)
    {
        _mySettings = mySettings.Value;
    }

    public IActionResult Index()
    {
        return Json(_mySettings.MyArray);
    }
}

O serviço de injeção de dependência do ASP.NET Core funciona como um encanto :)

AdrienTorris
fonte
Então, como você usa MySettingsna inicialização?
precisa saber é o seguinte
Eu recebo um erro que precisa de uma vírgula entre "MySettings" e "MyArray".
Markus #
35

Se você tiver uma matriz de objetos JSON complexos como este:

{
  "MySettings": {
    "MyValues": [
      { "Key": "Key1", "Value":  "Value1" },
      { "Key": "Key2", "Value":  "Value2" }
    ]
  }
}

Você pode recuperar as configurações desta maneira:

var valuesSection = configuration.GetSection("MySettings:MyValues");
foreach (IConfigurationSection section in valuesSection.GetChildren())
{
    var key = section.GetValue<string>("Key");
    var value = section.GetValue<string>("Value");
}
Dmitry Pavlov
fonte
30

Isso funcionou para eu retornar uma matriz de strings da minha configuração:

var allowedMethods = Configuration.GetSection("AppSettings:CORS-Settings:Allow-Methods")
    .Get<string[]>();

Minha seção de configuração fica assim:

"AppSettings": {
    "CORS-Settings": {
        "Allow-Origins": [ "http://localhost:8000" ],
        "Allow-Methods": [ "OPTIONS","GET","HEAD","POST","PUT","DELETE" ]
    }
}
CodeThief
fonte
15

No caso de retornar uma matriz de objetos JSON complexos da configuração, adaptei a resposta de @ djangojazz para usar tipos anônimos e dinâmicos em vez de tuplas.

Dada uma seção de configurações de:

"TestUsers": [
{
  "UserName": "TestUser",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
},
{
  "UserName": "TestUser2",
  "Email": "[email protected]",
  "Password": "P@ssw0rd!"
}],

Você pode retornar a matriz de objetos desta maneira:

public dynamic GetTestUsers()
{
    var testUsers = Configuration.GetSection("TestUsers")
                    .GetChildren()
                    .ToList()
                    .Select(x => new {
                        UserName = x.GetValue<string>("UserName"),
                        Email = x.GetValue<string>("Email"),
                        Password = x.GetValue<string>("Password")
                    });

    return new { Data = testUsers };
}
jaycer
fonte
Isto é incrível
Vladimir Demirev
11

Tipo de pergunta antiga, mas posso dar uma resposta atualizada para o .NET Core 2.1 com padrões C # 7. Digamos que eu tenha uma listagem apenas em appsettings.Development.json, como:

"TestUsers": [
  {
    "UserName": "TestUser",
    "Email": "[email protected]",
    "Password": "P@ssw0rd!"
  },
  {
    "UserName": "TestUser2",
    "Email": "[email protected]",
    "Password": "P@ssw0rd!"
  }
]

Posso extraí-los em qualquer lugar em que o Microsoft.Extensions.Configuration.IConfiguration seja implementado e conectado da seguinte maneira:

var testUsers = Configuration.GetSection("TestUsers")
   .GetChildren()
   .ToList()
    //Named tuple returns, new in C# 7
   .Select(x => 
         (
          x.GetValue<string>("UserName"), 
          x.GetValue<string>("Email"), 
          x.GetValue<string>("Password")
          )
    )
    .ToList<(string UserName, string Email, string Password)>();

Agora eu tenho uma lista de um objeto bem digitado que está bem digitado. Se eu for testUsers.First (), o Visual Studio agora deve mostrar opções para 'UserName', 'Email' e 'Password'.

djangojazz
fonte
9

No ASP.NET Core 2.2 e posterior, podemos injetar a IConfiguration em qualquer lugar do aplicativo, como no seu caso, você pode injetar a IConfiguration no HomeController e usá-lo dessa maneira para obter a matriz.

string[] array = _config.GetSection("MyArray").Get<string[]>();
arenoso
fonte
5

Você pode obter o array direto sem incrementar um novo nível na configuração:

public void ConfigureServices(IServiceCollection services) {
    services.Configure<List<String>>(Configuration.GetSection("MyArray"));
    //...
}
Andreas Friedel
fonte
4

Forma curta:

var myArray= configuration.GetSection("MyArray")
                        .AsEnumerable()
                        .Where(p => p.Value != null)
                        .Select(p => p.Value)
                        .ToArray();

Retorna uma matriz de string:

{"str1", "str2", "str3"}

mojtaba karimi
fonte
1
Trabalhou para mim. Obrigado. O uso do Microsoft.Extensions.Configuration.Binder também funciona, no entanto, eu gostaria de não fazer referência a outro pacote Nuget se uma única linha de código puder fazer o trabalho.
Sau001 16/05/19
3

Isso funcionou para mim; Crie algum arquivo json:

{
    "keyGroups": [
        {
            "Name": "group1",
            "keys": [
                "user3",
                "user4"
            ]
        },
        {
            "Name": "feature2And3",
            "keys": [
                "user3",
                "user4"
            ]
        },
        {
            "Name": "feature5Group",
            "keys": [
                "user5"
            ]
        }
    ]
}

Em seguida, defina alguma classe que mapeia:

public class KeyGroup
{
    public string name { get; set; }
    public List<String> keys { get; set; }
}

pacotes de pepitas:

Microsoft.Extentions.Configuration.Binder 3.1.3
Microsoft.Extentions.Configuration 3.1.3
Microsoft.Extentions.Configuration.json 3.1.3

Em seguida, carregue-o:

using Microsoft.Extensions.Configuration;
using System.Linq;
using System.Collections.Generic;

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

configurationBuilder.AddJsonFile("keygroup.json", optional: true, reloadOnChange: true);

IConfigurationRoot config = configurationBuilder.Build();

var sectionKeyGroups = 
config.GetSection("keyGroups");
List<KeyGroup> keyGroups = 
sectionKeyGroups.Get<List<KeyGroup>>();

Dictionary<String, KeyGroup> dict = 
            keyGroups = keyGroups.ToDictionary(kg => kg.name, kg => kg);
Roland Roos
fonte