【问题标题】:Issues pulling JSON values out in VB.NET在 VB.NET 中提取 JSON 值的问题
【发布时间】:2014-04-24 06:36:24
【问题描述】:

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

【问题讨论】:

    标签: json vb.net linq json.net


    【解决方案1】:

    这是我目前为我工作的,我知道这是不对的,但它正在工作。
    我很乐意尝试其他想法。

    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”,将子节点设置为“字母索引”和“表 1.摘要”,然后使用“WP0100300-aindex.txt”和“WP0100300-table1.txt”标记子节点"

    我知道这不漂亮,我必须做一些字符串操作来实现这一点,我确信我不需要这样做,只是在此过程中做错了。

    【讨论】:

      【解决方案2】:

      alpha 的值不是字符串。这是一个具有titlefilenamechange 属性的对象。

      如果您尝试将每个 2 级对象的名称添加到您的 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 的所有调用。

      【讨论】:

      • 我最初尝试过 item3.Value("title") ,但对我来说除了错误之外没有任何退路。我最终得到的代码只使用了 item3,它拉回了我需要它做的“字母索引”,但其他时候我使用了 item3.Value("title"),它拉回了我需要的东西。如果我使用 item3.ToString(),我会得到“title”:“Alphabetical Index”,如果这有助于解释发生了什么。
      • 我的树形视图应该看起来像“WP0100300.htm”,然后它的子视图将是“字母索引”和“表 1。摘要”然后标签需要是文件名的值
      猜你喜欢
      • 2022-01-10
      • 1970-01-01
      • 2016-06-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      相关资源
      最近更新 更多