繁体   English   中英

如何从Newtonsoft.Json(C#)访问嵌套的JSON对象?

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

这是C#WinForm应用程序需要访问的JSON文件。 根据您的帐户名(Windows AD登录),您将可以从应用程序访问特定文件。

根据其他开发人员的建议,我被鼓励使用Newtonsoft.Json。

我的问题是如何获取键“文件”的值

[
  {
    "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"
      }
    ]
  }
]

这是我的C#代码以及到目前为止我尝试过的操作,但仍然遇到问题

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

如前所述,我是使用Newtonsoft库的新手,因此,如果有更好的方法,请告诉我。

NuGet获取Newtonsoft.Json

添加类File.cs

using Newtonsoft.Json;

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

添加类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; }
    }
}

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

您可以使用以下任一选项:

创建自定义模型

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

然后使用:

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

不创建自定义模型

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

尝试使用下面的代码反序列化对象图。 然后您可以轻松查询数据

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

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM