1

Here is my JSON file that my C# WinForm application will need to access. Based on your account name (Windows AD Login), you will have access to specific files from the application.

Based on the suggestions of other developers, I was encouraged to use Newtonsoft.Json

My question is how do I get the values for the key "file"

[
  {
    "accountName": "admin.lastname",
    "files": [
      {
        "file": "department1.assistant.division.manager.js"
      },
      {
        "file": "department1.division.manager.js"
      },
      {
        "file": "department2.assistant.division.manager.1.js"
      },
      {
        "file": "department2.assistant.division.manager.2.js"
      },
      {
        "file": "department2.division.manager.js"
      },
      {
        "file": "department3.js"
      },
      {
        "file": "department4.assistant.division.manager.1.js"
      },
      {
        "file": "department4.assistant.division.manager.2.js"
      },
      {
        "file": "department4.division.manager.js"
      },
      {
        "file": "department5.assistant.division.manager.1.js"
      },
      {
        "file": "department5.division.manager.js"
      },
      {
        "file": "department6.division.manager.js"
      },
      {
        "file": "department7.division.manager.js"
      },
      {
        "file": "department8.division.manager.js"
      },
      {
        "file": "department9.division.manager.js"
      },
      {
        "file": "department10.js"
      },
      {
        "file": "department11.division.manager.js"
      },
      {
        "file": "department12.assistant.division.manager.1.js"
      },
      {
        "file": "department12.assistant.division.manager.2.js"
      },
      {
        "file": "department12.assistant.division.manager.3.js"
      },
      {
        "file": "department12.assistant.division.manager.4.js"
      },
      {
        "file": "department12.division.manager.js"
      },
      {
        "file": "department13.js"
      }
    ]
  },
  {
    "accountName": "firstname.lastname",
    "files": [
      {
        "file": "department1.assistant.division.manager.js"
      },
      {
        "file": "department1.division.manager.js"
      },
      {
        "file": "department2.assistant.division.manager.1.js"
      },
      {
        "file": "department2.assistant.division.manager.2.js"
      },
      {
        "file": "department2.division.manager.js"
      },
      {
        "file": "department3.js"
      },
      {
        "file": "department4.assistant.division.manager.1.js"
      },
      {
        "file": "department4.assistant.division.manager.2.js"
      },
      {
        "file": "department4.division.manager.js"
      },
      {
        "file": "department5.assistant.division.manager.1.js"
      },
      {
        "file": "department5.division.manager.js"
      },
      {
        "file": "department6.division.manager.js"
      },
      {
        "file": "department7.division.manager.js"
      },
      {
        "file": "department8.division.manager.js"
      },
      {
        "file": "department9.division.manager.js"
      },
      {
        "file": "department10.js"
      },
      {
        "file": "department11.division.manager.js"
      },
      {
        "file": "department12.assistant.division.manager.1.js"
      },
      {
        "file": "department12.assistant.division.manager.2.js"
      },
      {
        "file": "department12.assistant.division.manager.3.js"
      },
      {
        "file": "department12.assistant.division.manager.4.js"
      },
      {
        "file": "department12.division.manager.js"
      },
      {
        "file": "department13.js"
      }
    ]
  },
  {
    "accountName": "jason.bourne",
    "files": [
      {
        "file": "department1.assistant.division.manager.js"
      },
      {
        "file": "department1.division.manager.js"
      },
      {
        "file": "department2.assistant.division.manager.1.js"
      },
      {
        "file": "department2.assistant.division.manager.2.js"
      },
      {
        "file": "department2.division.manager.js"
      },
      {
        "file": "department3.js"
      },
      {
        "file": "department4.assistant.division.manager.1.js"
      },
      {
        "file": "department4.assistant.division.manager.2.js"
      },
      {
        "file": "department4.division.manager.js"
      },
      {
        "file": "department5.assistant.division.manager.1.js"
      },
      {
        "file": "department5.division.manager.js"
      },
      {
        "file": "department6.division.manager.js"
      },
      {
        "file": "department7.division.manager.js"
      },
      {
        "file": "department8.division.manager.js"
      },
      {
        "file": "department9.division.manager.js"
      },
      {
        "file": "department10.js"
      },
      {
        "file": "department11.division.manager.js"
      },
      {
        "file": "department12.assistant.division.manager.1.js"
      },
      {
        "file": "department12.assistant.division.manager.2.js"
      },
      {
        "file": "department12.assistant.division.manager.3.js"
      },
      {
        "file": "department12.assistant.division.manager.4.js"
      },
      {
        "file": "department12.division.manager.js"
      },
      {
        "file": "department13.js"
      }
    ]
  },
  {
    "accountName": "admin.bourne",
    "files": [
      {
        "file": "department1.assistant.division.manager.js"
      },
      {
        "file": "department1.division.manager.js"
      },
      {
        "file": "department2.assistant.division.manager.1.js"
      },
      {
        "file": "department2.assistant.division.manager.2.js"
      },
      {
        "file": "department2.division.manager.js"
      },
      {
        "file": "department3.js"
      },
      {
        "file": "department4.assistant.division.manager.1.js"
      },
      {
        "file": "department4.assistant.division.manager.2.js"
      },
      {
        "file": "department4.division.manager.js"
      },
      {
        "file": "department5.assistant.division.manager.1.js"
      },
      {
        "file": "department5.division.manager.js"
      },
      {
        "file": "department6.division.manager.js"
      },
      {
        "file": "department7.division.manager.js"
      },
      {
        "file": "department8.division.manager.js"
      },
      {
        "file": "department9.division.manager.js"
      },
      {
        "file": "department10.js"
      },
      {
        "file": "department11.division.manager.js"
      },
      {
        "file": "department12.assistant.division.manager.1.js"
      },
      {
        "file": "department12.assistant.division.manager.2.js"
      },
      {
        "file": "department12.assistant.division.manager.3.js"
      },
      {
        "file": "department12.assistant.division.manager.4.js"
      },
      {
        "file": "department12.division.manager.js"
      },
      {
        "file": "department13.js"
      }
    ]
  }
]

Here is my C# code and what I tried so far but I am stuck

    public void loadAccessControl(String fileName)
    {
        var locationInformation = System.Environment.CurrentDirectory + Path.DirectorySeparatorChar + fileName;
        using (StreamReader file = File.OpenText(locationInformation))
        using (JsonTextReader reader = new JsonTextReader(file))
        {
            JArray o = (JArray)JToken.ReadFrom(reader);
            items = o;
            MessageBox.Show(items.ToString());
        }

        foreach (var item in items.Children())
        {
            var itemProperties = item.Children<JProperty>();
            var myElement = itemProperties.FirstOrDefault(x => x.Name == "accountName");
            var myElementValue = myElement.Value; ////This is a JValue type
            if (myElementValue.ToString().Contains(Environment.UserName))
            {
                MessageBox.Show("Authorized");
                authorizedAccess = true;
                myElement = itemProperties.FirstOrDefault(x => x.Name == "files");
                myElementValue = myElement.Value; ////This is a JValue type
                break;
            }
        }
    }

As I said before, I am new to using Newtonsoft's library so if there is a better way, please let me know.

1

3 Answers 3

2

Get from Newtonsoft.Json from NuGet.

Add class File.cs:

using Newtonsoft.Json;

namespace Accounts
{
    class File
    {
        [JsonProperty("file")]
        public string Filename { get; set; }
    }
}

Add class Account.cs:

using Newtonsoft.Json;
using System.Collections.Generic;

namespace Accounts
{
    class Account
    {
        [JsonProperty("accountName")]
        public string AccountName { get; set; }

        [JsonProperty("files")]
        public List<File> Files { get; set; }
    }
}

Add class Program.cs:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

namespace Accounts
{
    class Program
    {
        static void Main(string[] args)
        {

            const string filename = "accounts.json";
            List<Account> accounts = JsonConvert.DeserializeObject<List<Account>>(System.IO.File.ReadAllText(filename));

            foreach (Account account in accounts)
            {
                Console.WriteLine(account.AccountName);
                foreach (File file in account.Files)
                {
                    Console.WriteLine(file.Filename);
                }

                Console.WriteLine();
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

Comments

1

You can use either of these options:

Creating custom Models

public class Account
{
    public string AccountName { get; set; }
    public List<FileItem> Files { get; set; }
}
public class FileItem
{
    public string File { get; set; }
}

And then use:

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Account>>(jsonText);

Without Creating Custom Models

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<JArray>(jsonText)
    .Select(a => new
    {
        Account = a.Value<string>("accountName"),
        Files = a.Value<JArray>("files")
                    .Select(f => new { File = f.Value<string>("file") }).ToList()
    }).ToList();

1 Comment

Also without Newtonsoft.Json you can use System.Web.Script.Serialization.JavaScriptSerializer and deserialize json value. var result = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<List<Account>>(txt);
1

Try the bellow code to deserialize object graph. then you can query the data easily

public class AccessControlFile
{
    public string file { get; set; }
}

public class RootObject
{
    public string accountName { get; set; }
    public List<AccessControlFile> files { get; set; }
}
class Program
{
    static void Main(string[] args)
    {

        var jsonString = ""; // load from remote service or from a local file
        var obj = JsonConvert.DeserializeObject<List<RootObject>>(jsonString);

    }
}

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.