0

I am unable to access the "Units" Array in the json file. I have tried pulling the Json in different ways but it does not come in. I if I myConfig.GetSection("CatalogData:Recipeints") or do a myConfig.GetSection("CatalogData:Recipeints").GetChildren() I get no values, or keys. I figure it is because I am new to this. I can get the Recipeints Array just fine. But the Units is what comes up blank.

appSetting.json

    "Recipeints": [
      {
        "MemberNo": "xxxx",
        "Data": {
          "ShortName": "ACompany",
          "StoredProc": "unknown",
          "FileName": "unknown",
          "Deliminator": "~",
          "EmailFile": 0,
          "EmailAddress": "[email protected]",
          "FTPFile": 1,
          "FTPInfo": {
            "FTPName": "ftp.something.com",
            "User": "user",
            "Password": "password"
          },
          "FileDrop": 1,
          "FileDropLocation": "\\\\FTPServer\\data\\ACompany\\outbound\\",
          "FileOrder": "MemberNo,VendorItem,Price,Description",
          "Units": [
            {
              "UnitName": "EndCust",
              "CustNos": [ "c123","c234","c345","c111" ]
            }
          ]
        }
      }
    ]
  }

Classes

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CatalogCreator
{
    public class Recipient
    {
        public string MemberNo { get; set; }
        public Data Data { get; set; }
    }
    public class Data
    {
        public string ShortName { get; set; }
        public string StoredProc { get; set; }
        public string FileName { get; set; }
        public string Deliminatior { get; set; }
        public int EmailFile { get; set; }
        public string EmailAddress { get; set; }
        public int FTPFile { get; set; }
        public FTPInfo FTPInfo { get; set; }
        public int FileDrop { get; set; }
        public string FileDropLocation { get; set; }
        public string FileOrder { get; set; }
        public List<Unit> Units { get; set; }
    }
    public class FTPInfo
    {
        public string FTPName { get; set; }
        public string User { get; set; }
        public string Password { get; set; }
    }
    public class Unit
    {
        public string UnitName { get; set; }
        public string CustNos { get; set; }
    }
}
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CatalogCreator
{
    public static class CatalogData
    {
        
        class CData
        {

            
                public List<Recipient> Recipients;
            
        }
            private static List<Recipient> _Recipients = new List<Recipient>();
        
            public static List<Recipient> Recipients
            {
                get
                {
                    if (_Recipients.Count == 0) { Setup(); }
                    if (_Recipients.Count == 0)
                    {
                        List<Recipient> r = new List<Recipient>();
                        r.Add(new Recipient());
                    
                        return r; ;
                    }
                    else
                    {
                        return _Recipients;
                    }
                }
                set { _Recipients = value; }
            }



        public static void Setup()
        {
            //from the Settings 
            IConfiguration myConfig = new ConfigurationBuilder()
                .AddJsonFile("appSettings.json")
                .AddEnvironmentVariables()
                .Build();
            //var rep = myConfig.GetRequiredSection("CatalogData:Recipeints").Get<List<Recipient>>(); //.GetSection("Recipeints").GetChildren().AsEnumerable<List<Recipient>>();
            //var repRec = myConfig.GetRequiredSection("CatalogData").GetChildren();
            ////var repArray = repRec.AsEnumerable().ToList();
            //rep.ForEach(r => {

            //    _Recipients.Add(r);
            //    });
            var rep = myConfig.GetSection("CatalogData:Recipeints");
            List<Recipient> recipients = rep.Get<List<Recipient>>();
            
            //Dictionary<string, Recipient> data = new Recipient.ToDictionary(rep => rep.name, rep => rep); 

        }    
    }
}
2
  • Are you using ASP.NET or that simple console app? Commented Aug 12, 2022 at 23:29
  • This is a console app Commented Aug 12, 2022 at 23:41

2 Answers 2

2

In case of console application you need to do it manually for every recipient and assign to your data object:

  Recipients = config.GetSection("Recipeints").Get<List<Recipient>>();
  for (var index = 0; index < Recipients.Count; ++index)
  {
      ApiSettings[index].aboba = config.GetSection($"Recipeints:{index}:Units").Get<Unit>();
  }

BUT, as for me that`s not appsettings, that must be json file with data, which you can serialize/deserialize in easy way and what will have more sense

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

1 Comment

Wish I could mark both as an answer. I like this answer, but separating the items out to different files are more logical for what I am trying to do.
1

Try the following

{
  "Recipients": [
    {
      "MemberNo": "xxxx",
      "Data": {
        "ShortName": "ACompany",
        "StoredProc": "unknown",
        "FileName": "unknown",
        "Deliminator": "~",
        "EmailFile": 0,
        "EmailAddress": "[email protected]",
        "FTPFile": 1,
        "FTPInfo": {
          "FTPName": "ftp.something.com",
          "User": "user",
          "Password": "password"
        },
        "FileDrop": 1,
        "FileDropLocation": "\\\\FTPServer\\data\\ACompany\\outbound\\",
        "FileOrder": "MemberNo,VendorItem,Price,Description",
        "Units": [
          {
            "UnitName": "EndCust",
            "CustNos": [ "c123", "c234", "c345", "c111" ]
          }
        ]
      }
    },
    {
      "MemberNo": "xxxx",
      "Data": {
        "ShortName": "BCompany",
        "StoredProc": "unknown",
        "FileName": "unknown",
        "Deliminator": "~",
        "EmailFile": 0,
        "EmailAddress": "[email protected]",
        "FTPFile": 1,
        "FTPInfo": {
          "FTPName": "ftp.something.com",
          "User": "user",
          "Password": "password"
        },
        "FileDrop": 1,
        "FileDropLocation": "\\\\FTPServer\\data\\ACompany\\outbound\\",
        "FileOrder": "MemberNo,VendorItem,Price,Description",
        "Units": [
          {
            "UnitName": "EndCust",
            "CustNos": [ "D123", "D234", "D345", "D111" ]
          }
        ]
      }
    }
  ]
}

Each class should be in their own file.

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

namespace Demo
{
    partial class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
            var configuration = builder.Build();
            var recipients = configuration.GetSection("Recipients").Get<Recipient[]>();


            var dictionary = recipients.ToDictionary(r => r.Data.ShortName, r => r);

            foreach ((string key, Recipient value) in dictionary)
            {
                Console.WriteLine(key);
                foreach (var unit in value.Data.Units)
                {
                    Console.WriteLine($"\t{string.Join(",", unit.CustNos)}");
                }
            }

            Console.ReadLine();
        }
    }
    
    public class Recipient
    {
        public string MemberNo { get; set; }
        public Data Data { get; set; }
    }

    public class Data
    {
        public string ShortName { get; set; }
        public string StoredProc { get; set; }
        public string FileName { get; set; }
        public string Deliminator { get; set; }
        public int EmailFile { get; set; }
        public string EmailAddress { get; set; }
        public int FTPFile { get; set; }
        public Ftpinfo FTPInfo { get; set; }
        public int FileDrop { get; set; }
        public string FileDropLocation { get; set; }
        public string FileOrder { get; set; }
        public Unit[] Units { get; set; }
    }

    public class Ftpinfo
    {
        public string FTPName { get; set; }
        public string User { get; set; }
        public string Password { get; set; }
    }

    public class Unit
    {
        public string UnitName { get; set; }
        public string[] CustNos { get; set; }
    }

}

enter image description here

1 Comment

This is the most logical way to go. I figured I was just too close to see it.

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.