在VB.NET中提取JSON值的问题
我正在使用Visual Studio 2010,并使用Visual Basic进行编码。 我无法从JSON文件中提取值。 我可以得到最高的数据,但不能得到更低的数据。 它告诉我“无法将对象转换为字符串” 这里是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",
{
"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”,然后标记需要是文件名的值