appsettings.json からオブジェクト配列の情報を読み込む - ASP.NET

appsettings.json からオブジェクト配列を読み込むコードを紹介します。

概要

こちらの記事では、appsettings.json から配列のデータを読み込むコードを紹介しました。 この記事では、appsettings.jsonから値が配列のオブジェクトになっているデータを読み込むコードを紹介します。

セクションの下に配列データがある場合

コード

下記のappsettings.jsonファイルを用意します。Config セクション内に配列のデータが記述されています。
appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "Config": [
    {
      "id": 1,
      "name": "Penguin Cookie"
    },
    {
      "id": 2,
      "name": "Camel Caramel"
    },
    {
      "id": 3,
      "name": "WhiteBear Icecream"
    }
  ],
  "AllowedHosts": "*"
}

プログラムのコードは以下です。
読み取るオブジェクトのクラスを実装します。
ConfigItem.cs
namespace AppSettingsObjectArray
{
  public class ConfigItem
  {
    public int id { get; set; }
    public string name { get; set; }
  }
}

ASP.NET アプリケーション(.NET6)を作成して、Program.csに下記コードを記述します。
Program.cs
using AppSettingsObjectArray;
using Microsoft.Extensions.Configuration;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

IConfiguration configuration = new ConfigurationBuilder()
      .AddJsonFile("appsettings.json", true, true)
      .Build();

IConfigurationSection section = configuration.GetSection("Config");
ConfigItem[] confArray = section.Get<ConfigItem[]>();

string outputText = "<html><body>";
foreach (ConfigItem ci in confArray) {
  outputText += string.Format("ID:{0:d} - Name:{1}<br/>",ci.id,ci.name);
}
outputText += "</body></html>";

app.MapGet("/", (HttpContext context) => {
  context.Response.ContentType = "text/html";
  return outputText;
});

app.Run();

解説

はじめに、appsettings.jsonファイルに記述されているオブジェクト型のクラスを実装します。 今回の例では、オブジェクトは "id"と"name" の2つのメンバ変数を持つオブジェクトのため、idとnameのメンバ変数を持つクラスを実装します。 なお、メンバはプロパティとして実装する必要があります。
namespace AppSettingsObjectArray
{
  public class ConfigItem
  {
    public int id { get; set; }
    public string name { get; set; }
  }
}

appsettings.jsonファイルを読み込みセクションを読み込みます。appsettings.jsonから通常のデータを読み込む場合のコードと同様です。 詳細はこちらの記事を参照して下さい。
IConfiguration configuration = new ConfigurationBuilder()
      .AddJsonFile("appsettings.json", true, true)
      .Build();

IConfigurationSection section = configuration.GetSection("Config");

オブジェクト配列の値を読み込む場合は、IConfigurationSection のGet<T>メソッドを利用します。 オブジェクト配列の型は先ほど実装した ConfigItemクラスのため、ConfigItem[] を記述します。
ConfigItem[] confArray = section.Get<ConfigItem[]>();

なお、TList<ConfigItem>を与えるコードでも同様に動作します。
List<ConfigItem> confArray = section.Get<List<ConfigItem>>();

以下のコードで appsettings.jsonから読み出した値をページに表示します。
string outputText = "<html><body>";
foreach (ConfigItem ci in confArray) {
  outputText += string.Format("ID:{0:d} - Name:{1}<br/>",ci.id,ci.name);
}
outputText += "</body></html>";

app.MapGet("/", (HttpContext context) => {
  context.Response.ContentType = "text/html";
  return outputText;
});

実行結果

プロジェクトを実行します。Webブラウザが起動し、下図のページが表示されます。
appsettings.jsonファイルに記載したオブジェクトの値がページに表示されることが確認できます。

セクション内の値に配列データがある場合

コード

appsettings.jsonファイルの構造が以下の場合の例です。
AppData セクション内のProductsの値が配列になっています。
appsettings.json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AppData": {
    "Products": [
      {
        "id": 101,
        "name": "ふわふわ ソファー",
        "price": "24,800"
      },
      {
        "id": 102,
        "name": "かるがる チェアー",
        "price": "16,000"
      },
      {
        "id": 103,
        "name": "ひろびろ テーブル",
        "price": "54,000"
      },
      {
        "id": 104,
        "name": "かための ベッド",
        "price": "34,500"
      },
      {
        "id": 105,
        "name": "おしゃれ スタンド",
        "price": "84,000"
      }
    ]
  },
  "AllowedHosts": "*"
}

プログラムのコードは以下です。ASP.NET アプリケーション(.NET6)を作成します。
読み取るオブジェクトのクラスを実装します。
ProductsItem.cs
namespace AppSettingsObjectArrayValue
{
  public class ProductsItem
  {
    public int id { get; set; }
    public string name { get; set; }
    public string price { get; set; }
  }
}

Program.csに下記コードを記述します。
Program.cs
using AppSettingsObjectArrayValue;
using Microsoft.Extensions.Configuration;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

IConfiguration configuration = new ConfigurationBuilder()
      .AddJsonFile("appsettings.json", true, true)
      .Build();


IConfigurationSection section = configuration.GetSection("AppData:Products");
ConfigItem[] confArray = section.Get<ConfigItem[]>();
//List<ProductsItem> confArray = section.Get<List<ProductsItem>>(); //こちらでも可

string outputText = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
foreach (ProductsItem pi in confArray) {
  int cvalue;
  int.TryParse(pi.price, System.Globalization.NumberStyles.AllowThousands, null, out cvalue);
  outputText += string.Format("ID:{0:d} - Name:{1} - Price:{2:N}<br/>", pi.id, pi.name, cvalue);
}
outputText += "</body></html>";

app.MapGet("/", (HttpContext context) => {
  context.Response.ContentType = "text/html";
  return outputText;
});

app.Run();

解説

はじめに、appsettings.jsonファイルに記述されているオブジェクト型のクラスを実装します。 今回の例では、オブジェクトは "id"と"name" "price" の3つのメンバ変数を持つオブジェクトのため、id, name, priceのメンバ変数を持つクラスを実装します。 なお、メンバはプロパティとして実装する必要があります。
namespace AppSettingsObjectArrayValue
{
  public class ProductsItem
  {
    public int id { get; set; }
    public string name { get; set; }
    public string price { get; set; }
  }
}

appsettings.jsonファイルを読み込みセクションを読み込むコードは先の例と同じコードです。
セクション名の指定が先の例とは異なり、(セクション名):(値のキー名) の形式で指定します。
IConfigurationSection section = configuration.GetSection("AppData:Products");

取得したIConfigurationSection から値を呼び出すコードは先の例と同様にGet<T>メソッドを呼び出して値を取得します。
ConfigItem[] confArray = section.Get<ConfigItem[]>();

実行結果

プロジェクトを実行します。Webブラウザが起動し、下図のページが表示されます。appsettings.jsonファイルに記述した値がページに表示されます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-10-31
作成日: 2022-10-31
iPentec all rights reserverd.