【问题标题】:Parse Json in vb.net在 vb.net 中解析 Json
【发布时间】:2013-10-28 18:25:56
【问题描述】:

我有以下 Json,我希望在 vb.net 中循环并提取问题和结果。我尝试使用 Newtonsoft.json,但尽管 JSONlint 验证了 Json,但我得到了错误。实现这一目标的正确方法是什么?

{
    "Vehicle_Check": [
        19,
        {
            "question": "Brakes",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Water Levels",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Horn",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Washers",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Wipers",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Indicators",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Reflectors",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Oil Levels",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Lights",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Mirrors",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Steering",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Tyres Wheels",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Battery",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Fuel or Oil Leaks",
            "result": "OK",
            "Fault": ""
        },
        {
            "question": "Other",
            "result": "OK",
            "Fault": ""
        }
    ]
}

我用来解析 Json 的代码是:

Dim o As JObject = JObject.Parse(VCItem.Check)
Dim results As List(Of JToken) = o.Children().ToList
For Each item As JProperty In results
    item.CreateReader()
    Select Case item.Name
        'process data here
    End Select
Next

这仅返回最后一个元素:

{[
    19,
    {
        "question": "Other",
        "result": "OK",
        "Fault": ""
    }
]}

【问题讨论】:

  • 您遇到什么错误?
  • 我们可以看到您尝试用来进行反序列化的代码吗?
  • @user1898898 你应该编辑你的问题并将代码放在那里,而不是在评论中。
  • Select Case 代码里面是什么?你将process data here 逻辑的结果存储到一个变量中是什么?换句话说,什么“只”包含最后一个元素?
  • item.Name 持有:{[ 19, { "question": "Other", "result": "OK", "Fault": "" } ]}

标签: json vb.net


【解决方案1】:

实际上它是返回第一个和最后一个元素。鉴于您发布的内容,19 是数组中的第一项,无论如何这都不正确。

试试这个(是的,我知道它看起来很可怕)但我还必须从列表中删除 19,因为它不是对象而是字符串。您的数组中有不同的类型,如果必须保留,您需要测试字符串。我正在研究一种更好的方式来自己阅读 JSON,但它花费的时间比我希望的要长。

    Dim o As JObject = JObject.Parse(VCItem)
    Dim results As List(Of JToken) = o.Children().ToList
    For Each item As JProperty In results
        item.CreateReader()
        If item.Value.Type = JTokenType.Array Then
            Dim results2 As List(Of JToken) = item.Value.ToList
            For Each subitem As JObject In results2
                Dim results3 As List(Of JToken) = subitem.Children().ToList
                For Each temp2 As JProperty In results3
                    temp2.CreateReader()
                    MsgBox(temp2.Name)
                    MsgBox(temp2.Value)
                Next
            Next
        End If
    Next

找到了一种更简单的方式来显示您的值,但仍然取决于 JSON 字符串的结构(在此处找到更简单的方式:How to Parse Json children in VB.NET Newtonsoft

    Dim o As JObject = JObject.Parse(VCItem)
    Dim results As List(Of JToken) = o.Children().ToList
    For Each item As JProperty In results
        item.CreateReader()
        If item.Value.Type = JTokenType.Array Then
            For Each subitem As JObject In item.Values
                MsgBox(subitem("question"))
                MsgBox(subitem("result"))
                MsgBox(subitem("Fault"))
            Next
        End If
    Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2014-11-19
    相关资源
    最近更新 更多