簡體   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