json response auslesen nach einem bestimmten wert

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Drachie.

    json response auslesen nach einem bestimmten wert

    Moin,

    folgendes Problem, wo ich mir seit 2 tagen die Zähne dran ausbeisse. Ich habe ein json response für eine Schnittstelle bei einem Versandunternehmen wo Versandlabels erstellt werden. Der Response liefert die Package ID de Lanbel zurück. Dieser wird auch brav in eine Textbox geschrieben so wie in eine Variable die als string deklariert ist.

    nun soll au dem Response von einem bestimmten Item die Label-ID ausgelesen werden.


    VB.NET-Quellcode

    1. Dim request As HttpWebRequest = WebRequest.Create(postAddress)
    2. request.Method = "POST"
    3. request.ContentType = "application/json"
    4. request.Headers.Add(jsonstring1)
    5. Dim postByteData As Byte() = UTF8Encoding.UTF8.GetBytes(data)
    6. request.ContentLength = postByteData.Length
    7. Using postStream As Stream = request.GetRequestStream()
    8. postStream.Write(postByteData, 0, postByteData.Length)
    9. End Using
    10. Using resp = TryCast(request.GetResponse(), HttpWebResponse)
    11. Dim b As Byte() = Nothing
    12. Using stream As Stream = resp.GetResponseStream()
    13. Using ms As New MemoryStream()
    14. Dim count As Integer = 0
    15. Do
    16. Dim buf As Byte() = New Byte(1023) {}
    17. count = stream.Read(buf, 0, 1024)
    18. ms.Write(buf, 0, count)
    19. Loop While stream.CanRead AndAlso count > 0
    20. b = ms.ToArray()
    21. End Using
    22. End Using
    23. TextBox3.Text = Encoding.UTF8.GetString(b)
    24. Dim data2 As String
    25. data2 = Encoding.UTF8.GetString(b)
    26. Dim jss = New JavaScriptSerializer()
    27. Dim ditc As List(Of Object) = jss.Deserialize(Of List(Of Object))(data2)
    28. For Each item1 As Object In ditc
    29. ListBox2.DataSource = ditc
    30. ListBox2.DisplayMember = "package_id"
    31. TextBox3.Text = item1("package_id").ToString
    32. Next
    33. End Using



    der Response sieht wie folgt aus:

    XML-Quellcode

    1. {
    2. "result": "ok",
    3. "package_id": 396959,
    4. "url": "/api/v1.0/package/396959/"
    5. }


    aus dem Response soll jetzt der wer von Package_id ausgelesen werden.

    Mei problem dabei ist jetzt, das ich egal was ich bis jetzt versucht habe, ich jedesmal eine Fehlermeldung bekomme oder die Textbox und die listbox leer bleiben. kann mir da vielleicht einer helfen bitte?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Drachie“ ()

    Drachie schrieb:

    ich jedesmal eine Fehlermeldung bekomme oder die Textbox und die listbox leer bleiben. kann mir da vielleicht einer helfen bitte?


    Wieso postest du uns die Fehlermeldung nicht? Die ist ziemlich relevant für uns.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    sry, total vergessen:

    "Für den Typ Char wurde kein Standardmember gefunden." oder auf Encoding.UTF8.GetString(b) kann nicht zugegriffen werden oder "Das Objekt des Typs "System.Byte[]" kann nicht in Typ "System.Collections.Generic.IEnumerable`1[System.Object]" umgewandelt werden."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Drachie“ ()

    Ich kann die Fehler nicht reproduzieren.
    Kommt evtl. etwas unerwartetes beim JSON zurück ? Wenn ich mir nur dein gepostetes JSON als String reingebe funktioniert dein Code ohne Probleme. Bei Strict Off.
    Du solltest unbedingt mal "Option Strict On" setzten siehe: Visual Studio - Empfohlene Einstellungen

    Desweiteren schlägt selbst MicrosoftDocs vor statt dem JavaScriptSerializer lieber JSON.NET zu verwenden
    Würde ich dir auch empfehlen macht vieles sehr einfacher.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    ich habe nochmal nach etwas pause über den Code drüber geschaut und den fehler behoben so wie den response auflösen können das der gewünschte wert zurück geliefert wird.

    zwar lasse ich den response jetzt in eine Textbox laufen und zerlege den dort mittels textchange bis die ID übrig bleit, was man vielleicht etwas eleganter lösen könnte aber es tut erstmal seinen zweck.
    ich habe das wie folgt erstmal gelöst damit es läuft:

    Package ID Besorgen vom Dropshipper:

    VB.NET-Quellcode

    1. Dim jsonstring1 As String
    2. Dim jsonstring2 As String
    3. Dim jsonstring3 As String
    4. adresse1 = Zeile1.Text
    5. adresse2 = Zeile2.Text
    6. adresse3 = Zeile3.Text
    7. strase = Strasse.Text
    8. pzahl = PLZ.Text
    9. ot = Ort.Text
    10. Dim numberofpackages As String = anzahl.Text
    11. 'prüfen der Paketfelder für die Label
    12. If lang.Text = Nothing Then
    13. MessageBox.Show("Feld muss Länge in cm enthalten!",
    14. "Fehler im Feld Länge!",
    15. MessageBoxButtons.OK,
    16. MessageBoxIcon.Error,
    17. MessageBoxDefaultButton.Button1)
    18. Else
    19. lenght = lang.Text
    20. End If
    21. If hoch.Text = Nothing Then
    22. MessageBox.Show("Feld muss Höhe in cm enthalten!",
    23. "Fehler im Feld Höhe!",
    24. MessageBoxButtons.OK,
    25. MessageBoxIcon.Error,
    26. MessageBoxDefaultButton.Button1)
    27. Else
    28. height = hoch.Text
    29. End If
    30. If breit.Text = Nothing Then
    31. MessageBox.Show("Feld muss Breite in cm enthalten!",
    32. "Fehler im Feld Breite!",
    33. MessageBoxButtons.OK,
    34. MessageBoxIcon.Error,
    35. MessageBoxDefaultButton.Button1)
    36. Else
    37. width = breit.Text
    38. End If
    39. If schwer.Text = Nothing Then
    40. MessageBox.Show("Feld muss Gewicht in kg enthalten!",
    41. "Fehler im Feld Gewicht!",
    42. MessageBoxButtons.OK,
    43. MessageBoxIcon.Error,
    44. MessageBoxDefaultButton.Button1)
    45. Else
    46. weight = schwer.Text
    47. End If
    48. If anzahl.Text = Nothing Then
    49. MessageBox.Show("Feld muss Anzahl der Packete enthalten!",
    50. "Fehler im Feld Paketanzahl!",
    51. MessageBoxButtons.OK,
    52. MessageBoxIcon.Error,
    53. MessageBoxDefaultButton.Button1)
    54. Else
    55. numberofpackages = anzahl.Text
    56. End If
    57. 'prüfen um alle felder werte enthalten
    58. If String.IsNullOrEmpty(lenght) AndAlso String.IsNullOrEmpty(height) AndAlso String.IsNullOrEmpty(width) AndAlso
    59. String.IsNullOrEmpty(weight) AndAlso String.IsNullOrEmpty(numberofpackages) Then
    60. MessageBox.Show("Nicht alle pflichtfelder sind ausgefüllt. Bitte Prüfen!",
    61. "Fehler! nicht alle Felder gefüllt!",
    62. MessageBoxButtons.OK,
    63. MessageBoxIcon.Error)
    64. Else
    65. 'MsgBox("Label wird erstellt") war als haltepunkt
    66. End If
    67. jsonstring1 = "Authorization: Token <myprivatetoken>"
    68. jsonstring2 = "Content-Type: application/json"
    69. jsonstring3 = "{
    70. ""from_country"": ""45"",
    71. ""from_company_name"": ""<meine firma>"",
    72. ""from_contact_name"": ""<abteilung>"",
    73. ""from_address"": ""<firmenadresse>"",
    74. ""from_city"": ""<ort>"",
    75. ""from_postal_code"": ""<plz>"",
    76. ""to_country"": ""45"",
    77. ""to_company_name"": """ & adresse1 & """,
    78. ""to_contact_name"": """ & adresse2 & """,
    79. ""to_address"": """ & strase & """,
    80. ""to_city"": """ & ot & """,
    81. ""to_postal_code"": """ & pzahl & """,
    82. ""service_code"": """ & versand & """,
    83. ""length"": """ & lenght & """,
    84. ""height"": """ & height & """,
    85. ""width"": """ & width & """,
    86. ""weight"": """ & weight & """,
    87. ""number_of_packages"": """ & numberofpackages & """
    88. }"
    89. 'MsgBox(jsonstring3) war zum prüfen ob der string richtig erstellt wird
    90. 'package Id besorgen
    91. Dim url = "<url zur API>"
    92. Dim data As String = jsonstring3
    93. Dim postAddress = New Uri(url)
    94. Dim request As HttpWebRequest = WebRequest.Create(postAddress)
    95. request.Method = "POST"
    96. request.ContentType = "application/json"
    97. request.Headers.Add(jsonstring1)
    98. Dim postByteData As Byte() = UTF8Encoding.UTF8.GetBytes(data)
    99. request.ContentLength = postByteData.Length
    100. Using postStream As Stream = request.GetRequestStream()
    101. postStream.Write(postByteData, 0, postByteData.Length)
    102. End Using
    103. Using resp = TryCast(request.GetResponse(), HttpWebResponse)
    104. Dim b As Byte() = Nothing
    105. Using stream As Stream = resp.GetResponseStream()
    106. Using ms As New MemoryStream()
    107. Dim count As Integer = 0
    108. Do
    109. Dim buf As Byte() = New Byte(1023) {}
    110. count = stream.Read(buf, 0, 1024)
    111. ms.Write(buf, 0, count)
    112. Loop While stream.CanRead AndAlso count > 0
    113. b = ms.ToArray()
    114. End Using
    115. End Using
    116. TextBox3.Text = Encoding.UTF8.GetString(b)
    117. End Using
    118. ListBox2.Items.Add(TextBox3.Text + vbNewLine)



    auseinandernehmen des Response um die Package_id zu bekommen (ich weis, das man es auch anders lösen könnte. ist hier nur der etwas schnellere weg):

    VB.NET-Quellcode

    1. Private Sub TextBox3_TextChanged_1(sender As Object, e As EventArgs) Handles TextBox3.TextChanged
    2. TextBox3.Text = TextBox3.Text.Replace("{", "")
    3. TextBox3.Text = TextBox3.Text.Replace("}", "")
    4. TextBox3.Text = TextBox3.Text.Replace("/", "")
    5. TextBox3.Text = TextBox3.Text.Replace("""", "")
    6. TextBox3.Text = TextBox3.Text.Replace("result: ok", "")
    7. TextBox3.Text = TextBox3.Text.Replace("url: apiv1.0package", "")
    8. TextBox3.Text = TextBox3.Text.Replace("package_id:", "")
    9. TextBox3.Text = TextBox3.Text.Replace(" ", "")
    10. TextBox3.Text = TextBox3.Text.Replace(",", vbCrLf)
    11. TextBox3.Lines = (From s As String In TextBox3.Lines Where s.Length > 0 Select s).ToArray
    12. ReDim Preserve TextBox3.Lines(TextBox3.Lines.Count - 1)
    13. TextBox3.Text = TextBox3.Text.Substring(TextBox3.Text.IndexOf(vbCr) + 1)
    14. End Sub
    Naja lass da einmal was anderes zurück kommen als das was du willst und das funktioniert nicht mehr.
    Du validierst ja nirgends das "result" auch "ok" ist. Was ist wenn da z.b. "fehler" drin steht und package_id gibt es nicht?

    Ich empfehle dafür newtonsoft.com/json zu verwenden. Dadurch brauchst du das ganze Replace gefusel nicht
    und kannst wenigstens auch dann prüfen ob überhaupt das JSON so ist wie du das haben willst (ist das result ok usw)
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    danke für den hinweis. umstellung auf newtonsoft/json kommt als nächstes rein. der komplette code habe ich gerade fertig gestellt, samt automatische ausgabe der labels am drucker. mal sehen, vielleicht werde ich den später veröffentlichen für alle
    Nach der umstellung auf json.net klpatt soweit auch alles bis auf folgendes:

    Quellcode

    1. {
    2. "package_id": "400137",
    3. "number": "4425400137",
    4. "duplicate_ids": [
    5. 400138
    6. ],
    7. "created": "2019-02-25 10:58:19+00:00",
    8. "is_paid": true,
    9. "tracking": {}
    10. }


    hier schmeisst er mit beim hinzufügen in die Listbox die duplicate_ids als (sammlung) rein, was aber nicht sein darf, da diese ja auch wiederum eine Package_id sind.

    Alles andere sortiert er sauber ein wie es sein soll.

    Meine Frage dazu:

    Wie stell ich es an das jetzt "duplicate_ids": [] in die Liste ale einzelwerte hinzugefügt werden?

    und wenn "duplicate_ids": [] leer sind nur die Packege_id addet?