0

vb.netでループして質問と結果を抽出したい次のJsonがあります。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": ""
    }
]}
4

1 に答える 1

0

実際には、最初と最後の要素を返しています。あなたが投稿したものを考えると、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
于 2014-04-09T09:06:12.387 に答える