我正在使用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
答案 0 :(得分:0)
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
的所有电话。
答案 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”标记子节点“
我知道它不漂亮,我不得不做一些字符串操作来实现这一点,我确信我不需要,并且一路上做错了。