DOBON.NETプログラミング道掲示板

■35407 / 親階層)  JSONの複雑な入れ子内部の値を取りたい。
□投稿者/ けい 一般人(5回)-(2023/05/08(Mon) 15:13:41)
  • アイコン環境/言語:[VB.NET2022、Windows10] 
    分類:[.NET] 

    お世話になります。

    VB.NET2022のForm1にButton1とTextBox1を配置します。

    Button1を押すと、System.Text.jsonでJSONファイル(test.json)を読み込み、
    その中の項目の値をTextBox1に表示させます。

    JSONファイルがやや複雑で、値を取れる場合と取れない場合とがあり、
    取れない場合の改善方法を教えていただきたいと思っております。

    コードは以下の通りです。

    (コード)
    -----------------------------------------------------------
    Imports System.IO
    Imports System.Runtime
    Imports System.Text

    Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim enc As Encoding = Encoding.UTF8
    Dim jsonStr As String = ""
    Dim jsonFilePath As String = "C:\test.json"

    Using sr As New System.IO.StreamReader(jsonFilePath, enc)
    jsonStr = sr.ReadToEnd()
    End Using

    Dim jsonNode = System.Text.Json.Nodes.JsonNode.Parse(jsonStr)
    TextBox1.Text = <(下記参照)>'・・・・・・・・・・・・A

    End Sub

    End Class

    -----------------------------------------------------------
    また、JSONファイルの内容は、
    以下のようになっています。
    -----------------------------------------------------------
    {
    "ResultInfo": {'・・・・・・・・・・・・・・・・・・・・・・B
    "Count": 1,
    "Total": 1,
    "Start": 1,
    "Status": 200,
    "Description": "",
    "Copyright": "",
    "Latency": 0.017
    },'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・C
    "Feature": ['・・・・・・・・・・・・・・・・・・・・・・・・・・・D
    {
    "Id": "8d8acd6f1e7d81d5d10a9a18e8e927ec",
    "Gid": "",
    "Name": "\u3012234-0054",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.58691098,35.37690957"
    },
    "Category": [
    "\u90F5\u4FBF\u756A\u53F7",
    "\u753A\u57DF\u90F5\u4FBF\u756A\u53F7"
    ],
    "Description": "Yahoo!\u90F5\u4FBF\u756A\u53F7\u691C\u7D22",
    "Style": [],
    "Property": {
    "Uid": "1831ff4e59f55c19370fc71002827b41f317f341",
    "CassetteId": "3ee7f7f5fe1ef2267e319b15168e37d3",
    "Country": {
    "Code": "JP",
    "Name": "\u65E5\u672C"
    },
    "Address": "\u795E\u5948\u5DDD\u770C\u6A2A\u6D5C\u5E02\u6E2F\u5357\u533A\u6E2F\u5357\u53F0",
    "GovernmentCode": "14111",
    "AddressMatchingLevel": "6",
    "PostalName": "\u795E\u5948\u5DDD\u770C\u6A2A\u6D5C\u5E02\u6E2F\u5357\u533A\u6E2F\u5357\u53F0",
    "Station": [
    {
    "Id": "23365",
    "SubId": "2336501",
    "Name": "\u6D0B\u5149\u53F0",
    "Railway": "JR\u5728\u6765\u7DDA",
    "Exit": "\u51FA\u53E3",
    "ExitId": "5999",
    "Distance": "1123",
    "Time": "14",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.596374,35.378634"
    }
    },
    {
    "Id": "23157",
    "SubId": "2315701",
    "Name": "\u6E2F\u5357\u53F0",
    "Railway": "JR\u5728\u6765\u7DDA",
    "Exit": "\u51FA\u53E3",
    "ExitId": "5628",
    "Distance": "1316",
    "Time": "16",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.576543,35.375218"
    }
    },
    {
    "Id": "23158",
    "SubId": "2315801",
    "Name": "\u6E2F\u5357\u4E2D\u592E",
    "Railway": "\u6A2A\u6D5C\u5E02\u55B6\u5730\u4E0B\u9244\u30D6\u30EB\u30FC\u30E9\u30A4\u30F3",
    "Exit": "2",
    "ExitId": "5630",
    "Distance": "3334",
    "Time": "41",
    "Geometry": {
    "Type": "point",
    "Coordinates": "139.591038,35.401302"
    }
    }
    ],
    "OpenForBusiness": "",
    "Detail": {
    "PcUrl1": "http://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=234-0054"
    }
    }
    }
    ]'・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・E
    }

    -----------------------------------------------------------

    上記のAのところで、
    下記のように書いた場合、
    成功するものと失敗するものとがあります。

    (成功)

    TextBox1.Text = jsonNode("ResultInfo").ToString
    B〜Cが取得される。

    TextBox1.Text = jsonNode("ResultInfo").Item("Latency").ToString
    "Latency"の値が表示される。

    TextBox1.Text = jsonNode("Feature").ToString
    D〜Eが取得される。

    (失敗)

    TextBox1.Text = jsonNode("Feature").Item("Id").ToString
    「System.InvalidOperationException: 'The node must be of type 'JsonObject'.'」

    TextBox1.Text = jsonNode("Property").ToString
    TextBox1.Text = jsonNode("Station").ToString
    「System.NullReferenceException: 'Object reference not set to an instance of an object.'System.Text.Json.Nodes.JsonNode.this[string].get が Nothing を返しました。」

    という具合です。

    JSONファイルの内容自体は、Visual Studio Code上で、
    特に構文的間違いは出てきません。

    jsonNode("Feature")の内部の各項目の値を取得するには、どのように書けばよいか、ご教示ください。

    よろしくお願い申し上げます。



マルチポストを報告
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
親記事 →Re[1]: JSONの複雑な入れ子内部の値を取りたい。 /Hongliang
 
上記関連ツリー

Nomalアイコン JSONの複雑な入れ子内部の値を取りたい。 / けい (23/05/08(Mon) 15:13) #35407 ←Now
Nomalアイコン Re[1]: JSONの複雑な入れ子内部の値を取りたい。 / Hongliang (23/05/08(Mon) 21:24) #35408
  └Nomalアイコン Re[2]: JSONの複雑な入れ子内部の値を取りたい。 / けい (23/05/09(Tue) 10:38) #35409
    └Nomalアイコン Re[3]: JSONの複雑な入れ子内部の値を取りたい。 / けい (23/05/09(Tue) 15:28) #35410 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -