6

我正在使用 Newtonsoft Json.Net 库使用 VB.NET 解析 Json

    Json Data
    ---------
    {
        "CC": "sample.cc@emailDomain.com",
        "CcFull": [
            {
                "Email": "sample.cc@emailDomain.com",
                "Name": "John Sample"
            },
            {
                "Email": "another.cc@emailDomain.com",
                "Name": "Mike Sample"
            }
        ],
        "FromFull" : {
            "Email": "myUser@theirDomain.com",
            "Name": "John Doe"
         }
    }

因此,我可以得到一个有效的 JObject:

    Dim o As JObject = JObject.Parse(strJson)

然后我可以获取 JToken 列表并遍历它们并轻松获取根项值 - 但是如何获取 CcFull 的子记录?

    Dim results As List(Of JToken) = o.Children().ToList
    For Each item As JProperty In results
        item.CreateReader()
        Select Case item.Name
            Case "CC"
                dim strCC = item.Value.ToString
            Case "CcFull"
                'This has children (Email and Name)

        End Select
     Next 

似乎我可以使用 JArray 或解析 item.value - 但语法让我难以理解。

我不想在 VB 中设置一个完整的强类型模型并进行自动反序列化 - 更喜欢在 C# 中执行它的动态方式 - 或者最好只为 CcFull 节点迭代 n 个子节点并取出电子邮件的值并命名并将它们放在通用列表中。

似乎 SO 或谷歌搜索没有好的 VB.NET 示例。

C# 有完全简单的方法来做到这一点 - 但我被困在这个项目的 VB.NET 中。

谢谢大家

4

1 回答 1

5

我不是 JSON.Net 中的 Linq to JSON 实现方面的专家,但这对我有用。

你几乎一直在那里。您需要做的就是在对象模型中再深入一点。

Dim results As List(Of JToken) = o.Children().ToList
For Each item As JProperty In results
    item.CreateReader()
    Select Case item.Name
        Case "CC"
            Dim strCC = item.Value.ToString
        Case "CcFull"
            Dim strEmail As String
            Dim strName As String

            For Each subitem As JObject In item.Values
                strEmail = subitem("Email")
                strName = subitem("Name")
            Next
    End Select
Next

正如您所指出的,您从结果列表中获得的项目具有子项目。该子项具有一系列值 - JSON 字符串中括号表示的数组。该Values方法是一个 IEnumerable,因此我们可以对其进行迭代,从每次迭代中接收一个 JObject。该对象表示 CcFull 数组中的单个条目。然后,您可以使用属性名称作为索引来检索该属性的值。

于 2013-04-13T00:01:53.793 回答