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



我正在使用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中获取值的代码部分最上面的For Each工作,我可以拉回名称(WP0100300.thm)没有问题,所以我假设我将获取该名称的值并对其进行解析,并通过相同的For Each运行它以获得嵌套的名称(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的值不是字符串。它是具有titlefilenamechange性质的物体。

如果你试图将每个第二级对象的名称添加到TreeView中,以下操作将起作用:

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

这比你刚才做的要简单多了。希望它能让你找到正确的方向。您不需要调用所有的CreateReaderChildren

这是我目前为我工作的,我知道这是不对的,但它是工作的。
我很乐意给其他想法一个机会。

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

这将我的节点设置为"WP0100300.htm",子节点设置为"字母索引"one_answers"表1"。,然后用"wp0100300 - ainindex .txt"one_answers"WP0100300-table1.txt"标记子节点

我知道这是不漂亮,我不得不做一些字符串操作来实现这一点,我确信我不需要,只是做了一些错误的一路上。

相关内容

  • 没有找到相关文章

最新更新