41

I'd like to store a one dimensional string array as an entry in my appSettings. I can't simply separate elements with , or | because the elements themselves could contain those characters.

I was thinking of storing the array as JSON then deserializing it using the JavaScriptSerializer.

Is there a "right" / better way to do this?

(My JSON idea feels kinda hacky)

1
  • 1
    I recommend the Newtonsoft JSON stuff, if you go that route... Commented May 2, 2012 at 18:13

6 Answers 6

27

You could use the AppSettings with a System.Collections.Specialized.StringCollection.

var myStringCollection = Properties.Settings.Default.MyCollection;
foreach (String value in myStringCollection)
{ 
    // do something
}

Each value is separated by a new line.

Here's a screenshot (german IDE but it might be helpful anyway)

enter image description here

Sign up to request clarification or add additional context in comments.

4 Comments

Can this be used for integers?
@akdurmus: only if you convert them to int: int[] ints = new int[strings.Count]; for(int i = 0; i < strings.Count; i++) ints[i] = int.Parse(strings[i]);
I seem to find a better answer and posted below. Thank you @Tim
A typo in the code: myStringCollection vs. myCollection.
17

ASP.Net Core supports it binding a list of strings or objects.

For strings as mentioned, it is possible to retrieve it through AsEnumerable().

Or a list of objects via Get<List<MyObject>>(). The sample is below.

appsettings.json:

{
 ...
   "my_section": {
     "objs": [
       {
         "id": "2",
         "name": "Object 1"
       },
       {
         "id": "2",
         "name": "Object 2"
       }
     ]
   }
 ...
}

Class to represent the object

public class MyObject
{
    public string Id { get; set; }
    public string Name { get; set; }
}

Code to retrieve from appsettings.json

Configuration.GetSection("my_section:objs").Get<List<MyObject>>();

2 Comments

Thank you! This works for me. Previously tried simply getvalue and it was null
This is super helpful @Rodrigo. What would the syntax look like to pick out an object having a specific id? Such as the one having "id":"2" ?
12

For integers I found the following way quicker.

First of all create a appSettings key with integer values separated by commas in your app.config.

<add key="myIntArray" value="1,2,3,4" />

Then split and convert the values into int array by using LINQ

int[] myIntArray =  ConfigurationManager.AppSettings["myIntArray"].Split(',').Select(n => Convert.ToInt32(n)).ToArray();

Comments

12

For strings it is easy, simply add the following to your web.config file:

<add key="myStringArray" value="fred,Jim,Alan" />

and then you can retrieve the value into an array as follows:

var myArray = ConfigurationManager.AppSettings["myStringArray"].Split(',');

2 Comments

Did you mean [...] around "MyStringArray", not (...), or am I missing something?
It should be var myArray = ConfigurationManager.AppSettings["MyStringArray"].Split(',');
12

This may be what you are looking for:

appsettings storing the key NoLongerMaintained with an array of strings

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "NoLongerMaintained": ["BCD",
    "DDP",
    "DHF",
    "DHW",
    "DSG",
    "DTH",
    "SCH"]
}

Then you may retrieve it as an array string[] using

var NoLongerMaintained = _config.GetSection("NoLongerMaintained").Get<string[]>();

Comments

7

You may also consider using custom configuration section/Collection for this purpose. Here is a sample:

<configSections>
    <section name="configSection" type="YourApp.ConfigSection, YourApp"/>
</configSections>

<configSection xmlns="urn:YourApp">
  <stringItems>
    <item value="String Value"/>
  </stringItems>
</configSection>

You can also check on this excellent Visual Studio add-in that allows you to graphically design .NET Configuration Sections and automatically generates all the required code and a schema definition (XSD) for them.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.