2013-04-12 70 views
4

我有touble使用VB.NET使用Newtonsoft Json.Net库如何解析JSON儿童VB.NET Newtonsoft

Json Data 
    --------- 
    { 
     "CC": "[email protected]", 
     "CcFull": [ 
      { 
       "Email": "[email protected]", 
       "Name": "John Sample" 
      }, 
      { 
       "Email": "[email protected]", 
       "Name": "Mike Sample" 
      } 
     ], 
     "FromFull" : { 
      "Email": "[email protected]", 
      "Name": "John Doe" 
     } 
    } 
解析JSON

我能得到这样一个有效的JObject:

Dim o As JObject = JObject.Parse(strJson) 

然后我可以得到一个JTokens列表并遍历它们并轻松获取根项目值 - 但是如何让Child为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#中使用动态方法 - 或者最好只是为nCcull节点迭代n个子项并拔出电子邮件和名称的值,并将其放入通用列表中。

似乎在SO或Google上没有好的VB.NET示例。

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

感谢乡亲

回答

4

我在JSON.Net的LINQ到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数组中的单个条目。然后可以使用该属性名称作为索引来检索该属性的值。

+0

感谢鲍勃 - 做到了这一招:-) - 另一个问题出现了,Json的格式稍有不同,子项抛出了一个错误 – Charlez

+0

无法投射类型为'Newtonsoft.Json.Linq.JProperty'的对象来键入' Newtonsoft.Json.Linq.JObject' - 这个就是我刚刚在示例中添加的FromFull Json数据。这不包括周围的方括号[] - 并且来自公共API,因此我无法控制Json - 任何想法? – Charlez

+0

我找到了解决方案 - 只是使用strEmail = item.Value(“电子邮件”) - 这个数据只有1行电子邮件和全名 - 不是行集合 - 所以没有子项目 – Charlez