在VB.NET中将JSON值拉出的问题

时间:2014-03-18 14:04:16

标签: json vb.net linq json.net

我正在使用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

2 个答案:

答案 0 :(得分:0)

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的所有电话。

答案 1 :(得分:0)

以下是我目前为我工作的内容,我知道这不对,但它正在发挥作用 我很乐意提供其他想法。

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”,将子节点设置为“Alphabetical Index”和“Table 1. Summary”,然后使用“WP0100300-aindex.txt”和“WP0100300-table1.txt”标记子节点“

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