在VB.NET中提取JSON值的问题

在VB.NET中提取JSON值的问题,json,vb.net,linq,json.net,Json,Vb.net,Linq,Json.net,我正在使用Visual Studio 2010,并使用Visual Basic进行编码。 我无法从JSON文件中提取值。 我可以得到最高的数据,但不能得到更低的数据。 它告诉我“无法将对象转换为字符串” 这里是JSON的一部分 { "WP0100300.htm": { "alpha":{ "title": "Alphabetical Index", "filename": "WP0100300-aindex.txt",

我正在使用Visual Studio 2010,并使用Visual Basic进行编码。 我无法从JSON文件中提取值。 我可以得到最高的数据,但不能得到更低的数据。 它告诉我“无法将对象转换为字符串”

这里是JSON的一部分

{
    "WP0100300.htm":    {
        "alpha":{
            "title": "Alphabetical Index",
            "filename": "WP0100300-aindex.txt",
            "change": "None"
        },
        "T001": {
            "title": "Table 1. Summary",
            "filename": "WP0100300-table1.txt"
        }
    },
    "WP0100400.htm":    {
        "alpha":{
            "title": "Alphabetical Index",
            "filename": "WP0100400-aindex.txt",
            "change": "None"
        },
        "ref": {
            "title": "Reference Material Required",
            "filename": "WP0100400-refmatreq.txt",
            "change": "None"
        },
     }
}
下面是从JSON中获取值的代码部分 最上面的每个都有效,我可以毫无问题地收回名称(WP0100300.thm),因此我假设我会获取该名称的值并对其进行解析,然后对每个名称执行相同的操作,以获得嵌套名称(alpha)然后得到它的值,这样我就可以得到标题、文件名等,但我甚至不能收回JSON的第一个嵌套部分的名称,它说的是alpha、T001等等

Dim jResults As JObject = JObject.Parse(rawresp)
Dim results As List(Of JToken) = jResults.Children().ToList()

For Each item As JProperty In results
    item.CreateReader()

    Dim jResults2 As JObject = JObject.Parse(item.Value)
    Dim results2 As List(Of JToken) = jResults2.Children().ToList()

    For Each item2 As JProperty In results2
        item2.CreateReader()
        tvTest.Nodes.Add(item2.Name)
    Next
Next

alpha
的值不是字符串。它是一个具有
标题
文件名
更改
属性的对象

如果您试图将每个二级对象的名称添加到
树视图中,则以下操作将起作用:

Dim jResults = JObject.Parse(rawresp)

For Each item In jResults
    For Each item2 As JProperty In item.Value
        tvTest.Nodes.Add(item2.Name)
    Next
Next

这比你刚才做的要简单得多。希望它能让你朝着正确的方向前进。你不需要对
CreateReader
儿童的所有调用

这是我目前正在为我工作的东西,我知道它不正确,但它正在工作。
我很乐意尝试其他想法

Dim reader = New StreamReader(jsonFile.ToString())
Dim rawresp As String = reader.ReadToEnd()

Dim jResults As JObject = JObject.Parse(rawresp)
Dim results As List(Of JToken) = jResults.Children().ToList()

For Each item As JProperty In results
    item.CreateReader()
    tvTest.Nodes.Add(item.Name)

    Dim results2 As List(Of JToken) = item.Value.Children().ToList()
    Dim counter As Integer = tvTest.Nodes.Count() - 1
    tvTest.Nodes(counter).Tag = ""

    For Each item2 As JProperty In results2
        item2.CreateReader()

        Dim results3 As List(Of JToken) = item2.Value.Children().ToList()

       For Each item3 As JProperty In results3
           item3.CreateReader()

           If item3.ToString().IndexOf("title") <> -1 Then
               tvTest.Nodes(counter).Nodes.Add(item3)
           ElseIf item3.ToString().IndexOf("filename") <> -1 Then
               Dim counter2 = tvTest.Nodes(counter).Nodes.Count() - 1
               tvTest.Nodes(counter).Nodes(counter2).Tag = item3
           Else

           End If

        Next
    Next
Next
Dim reader=New StreamReader(jsonFile.ToString())
Dim rawrep As String=reader.ReadToEnd()
Dim jResults As JObject=JObject.Parse(rawrep)
Dim结果作为列表(JToken的)=jResults.Children().ToList()
对于结果中作为JProperty的每个项目
item.CreateReader()
tvTest.Nodes.Add(item.Name)
Dim results2 As List(属于JToken)=item.Value.Children().ToList()
作为整数的Dim计数器=tvTest.Nodes.Count()-1
tvTest.Nodes(计数器).Tag=“”
对于结果2中作为JProperty的每个项目2
item2.CreateReader()
Dim results3 As List(属于JToken)=item2.Value.Children().ToList()
对于结果3中作为JProperty的每个项目3
item3.CreateReader()
如果item3.ToString().IndexOf(“title”)-1,则
tvTest.Nodes(计数器).Nodes.Add(项目3)
ElseIf item3.ToString().IndexOf(“文件名”)-1然后
Dim counter2=tvTest.NOTES(计数器).NOTES.Count()-1
tvTest.Nodes(计数器).Nodes(计数器2.Tag=item3
其他的
如果结束
下一个
下一个
下一个
这将我的节点设置为“WP0100300.htm”,子节点设置为“字母索引”和“表1”。Summary”,然后用“WP0100300-aindex.txt”和“WP0100300-table1.txt”标记子节点

我知道这并不漂亮,我必须做一些字符串操作来实现这一点,我确信我不需要这样做,只是在过程中做了一些错误。

我最初尝试了item3.Value(“title”),这对我来说除了错误之外什么都没有收回。我最终得到的代码只使用item3,它收回了“字母索引”这正是我需要它做的,但其他时候我使用item3.Value(“title”),它收回了我需要的东西。如果我使用item3.ToString(),我会得到“title”:“字母索引”,如果这有助于解释发生了什么。我的treeview应该看起来像“WP0100300.htm”,那么它的子项将是“字母索引”和“表1.Summary”,然后标记需要是文件名的值