Kobek
Kobek

Reputation: 1211

ASPNET Core Options Binding does not populate dictionary key/value pair

I have the following JSON configuration

"Configurations": {
    "KeyA": {
      "Ids": []
    },
    "KeyB": {
      "Ids": [1, 2, 3]
    },
    "KeyC": {
      "Ids": [1, 2, 3],
      "OptionalData": "asdf"
    }

}

This is then read into the following object

public class AppConfiguration
{
    public Dictionary<ConfigType, ConfigurationData> Configurations {get; set;} = new Dictionary<ConfigType, ConfigurationData>();
}

public class ConfigurationData
{
    public HashSet<int> Ids {get;set;} = new HashSet<int>();

    public string OptionalData = "";
}

public Enum ConfigType
{
    KeyA = 1,
    KeyB = 2,
    KeyC = 3
}

I then bind this in ConfigureServices(IServiceCollection services) method using

services.Configure<AppConfiguration>(this.Configuration);

However, I notied that the configuration binding produces my AppConfiguration's dictionary with only the KeyB and KeyC keys, skipping KeyA, because its Ids array is empty. I read up on the behaviour of the configuration binding online, but as far as I saw it should bind the Ids to null, but here it just does not generate a key value pair in the dictionary altogether.

I tried removing the "Ids" property, leaving my config like "KeyA": {}", but this still did not work. The only way I can get it to parse is if I put in some numbers in the array, but this obviously not what I want.

I would like to know if there is anyway I can bind such a key-value pair, where I don't have any Ids in my array. This seems like it should be somehow supported out of the box, but I'm not sure why it's not working and how could I resolve it, without implementing some hacky custom configuration loader/binder.

Upvotes: 2

Views: 459

Answers (1)

Kobek
Kobek

Reputation: 1211

For anyone who stumbles upon this in the future, I managed to solve this by setting my array to null, instead of an empty array like so.

"Configurations": {
    "KeyA": {
      "Ids": null
    }
}

Upvotes: 1

Related Questions