使用JSON.NET

时间:2018-04-21 01:54:10

标签: arrays json vb.net json.net

我已经在这几天里自杀了,我无法弄明白。我绝不是程序员,这是我第一次尝试使用JSON。

我有一个GUI,我在VB.NET中编写,它收集脚本的信息。我正在使用JSON.NET。我将它捕获输入到GUI中的数据并将其作为JSON文件导出,但我现在需要读取JSON文件并将数据放回GUI中的功能。

我正在阅读数据文件的内容,如下所示:

Dim Json As String = File.ReadAllText(fileDlg.FileName)
Dim data As JObject = JObject.Parse(Json)

然后浏览文件的每个元素,如下所示:

AD_DomainNameTB.Text = data.SelectToken("ActiveDirectory.DomainName")
AD_FQDNTB.Text = data.SelectToken("ActiveDirectory.FQDN")
AD_DomainControllerTB.Text = data.SelectToken("ActiveDirectory.DomainController")
AD_SVCUsernameTB.Text = data.SelectToken("ActiveDirectory.SVCUsername")
AD_SVCPasswordTB.Text = data.SelectToken("ActiveDirectory.SVCPassword")
AD_BaseDNTB.Text = data.SelectToken("ActiveDirectory.BaseDN")

现在,我需要遍历一系列站点和站点详细信息,并将其输入到GUI上的datagridview中。我知道我可以为每个项目做下一个循环,但我不知道如何识别数组中的项目数。

JSON数据如下所示:

{
  "ActiveDirectory": {
    "DomainName": "CORP",
    "FQDN": "corp.company.local",
    "DomainController": "DC01",
    "SVCUsername": "SVC_AD",
    "SVCPassword": "SuperPass1",
    "BaseDN": "OU=Active,DC=CORP,DC=Ccompany,DC=Local",
    "CreateOUs": true,
    "CreateGPOs": true,
    "Sites": [
      {
        "Site": "Prod",
        "HSA": "True",
        "HSD": "True",
        "HVD": null
      },
      {
        "Site": "Test",
        "HSA": "True",
        "HSD": null,
        "HVD": "True"
      }
    ]
  }
}

我已经非常广泛地查看了该网站上的文档,但我无法找到我正在寻找的内容。我已尝试将其读入数据集,例如https://www.newtonsoft.com/json/help/html/DeserializeDataSet.htm,并且我尝试创建类似Deserialize json array in vb.net的类,但这对我没有意义。它超越了我的头脑。

非常感谢任何帮助。请理解,就像我说的那样,这对我来说是非常新的,所以我需要详细信息(不要以为我知道任何事情......因为我不会!!)

2 个答案:

答案 0 :(得分:0)

(使用Newtonsoft.Json.Linq

ActiveDirectory.Sites节点的类型为JArray,其属性为Count

你可以像这样迭代这些网站:

Dim Sites As JArray = data.SelectToken("ActiveDirectory.Sites")
For I = 0 To Sites.Count - 1
    Dim Site = Sites(I)
    ' use `Site` and `I` in this loop body
Next

但如果您不关心索引,则应使用For Each循环:

Dim Sites As JArray = data.SelectToken("ActiveDirectory.Sites")
For Each Site In Sites
    ' use `Site` in this loop body
Next

JObject还允许您使用以下property lookup语法访问属性:

Dim ActiveDirectory = data("ActiveDirectory")
Dim Sites = ActiveDirectory("Sites")
Dim SiteCount = Sites.Count

你可以写另一种方式:

For Each Site In data("ActiveDirectory")("Sites")
    ' use `Site` in this loop body
Next

答案 1 :(得分:0)

根据建议,我已经按照我的需要获取了代码。发布以下完整的块:

        Dim Json As String = File.ReadAllText(fileDlg.FileName)
        Dim data As JObject = JObject.Parse(Json)
        Dim site
        Dim SiteName
        Dim HSA
        Dim HSD
        Dim HVD

        AD_DomainNameTB.Text = data.SelectToken("ActiveDirectory.DomainName")
        AD_FQDNTB.Text = data.SelectToken("ActiveDirectory.FQDN")
        AD_DomainControllerTB.Text = data.SelectToken("ActiveDirectory.DomainController")
        AD_SVCUsernameTB.Text = data.SelectToken("ActiveDirectory.SVCUsername")
        AD_SVCPasswordTB.Text = data.SelectToken("ActiveDirectory.SVBPassword")
        AD_BaseDNTB.Text = data.SelectToken("ActiveDirectory.BaseDN")
        AD_CreateOUsCB.Checked = data.SelectToken("ActiveDirectory.CreateOUs")
        AD_CreateGPOCB.Checked = data.SelectToken("ActiveDirectory.CreateGPOs")

        Dim Sites As JArray = data.SelectToken("ActiveDirectory.Sites")
        For Each site In Sites
            SiteName = site.item("Site").ToString()
            HSA = site.item("HSA").ToString()
            HSD = site.item("HSD").ToString()
            HVD = site.item("HVD").ToString()

            If HSA = "" Then
                HSA = False
            End If
            If HSD = "" Then
                HSD = False
            End If
            If HVD = "" Then
                HVD = False
            End If
            AD_SitesDatagrid.Rows.Add({SiteName, HSA, HSD, HVD})
        Next

现在,可能有更好,更有效的方式来遍历数组中的数据,但这很有效。