我正在使用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
的值不是字符串。它是具有title
、filename
和change
性质的物体。
如果你试图将每个第二级对象的名称添加到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
这比你刚才做的要简单多了。希望它能让你找到正确的方向。您不需要调用所有的CreateReader
和Children
。
这是我目前为我工作的,我知道这是不对的,但它是工作的。
我很乐意给其他想法一个机会。
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"标记子节点
我知道这是不漂亮,我不得不做一些字符串操作来实现这一点,我确信我不需要,只是做了一些错误的一路上。