GettingStarted
GettingStarted

Reputation: 7605

how do I access nested JSON Objects from Newtonsoft.Json (C#)?

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.

Upvotes: 1

Views: 953

Answers (3)

jvs
jvs

Reputation: 36

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();
            }
        }
    }
}

Upvotes: 2

Dan Nguyen
Dan Nguyen

Reputation: 1348

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);

    }
}

Upvotes: 1

Reza Aghaei
Reza Aghaei

Reputation: 125197

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();

Upvotes: 1

Related Questions