JSON Parser für Visual Basic

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Redjo.

    JSON Parser für Visual Basic

    Hallo VB-Developer,

    ich will eine JSON seite der graph API Auslesen

    Quellcode

    1. { "id": "100001363520746", "name": "Jenni Hapunkt", "first_name": "Jenni", "last_name": "Hapunkt", "gender": "female", "locale": "de_DE" }


    aber mir fehlt jeglicher ansatz wie ich den Coode Parsern soll, das ich ihn so abrufenkann

    VB.NET-Quellcode

    1. Dim Vorname as string = PaerserObject.frist_name ' Jenni
    2. Dim Nachname as string = ParserObject.last_name ' Hapunkt


    Hat jemand ein Tutorial (gerne auf Deutsch :D)

    Danke für eure andworten
    Mit den String Funktionen oder RegEx?! Wasn daran so schwer ?(

    msdn.microsoft.com/de-de/library/system.string.aspx

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

    Schlechte idehe, den ich mus das ding ja bei jeder Json seite nutzen können

    Hier das Profiel:

    facebook.com/profile.php?id=100001363520746

    Unt hier die Query von Facebook

    graph.facebook.com/100001363520746

    Und das dibg mus bei jeder acount id functionieren und wen der Accestoken in System ist kommt eine Million anderer Atribute dazu!!!!
    Zueerst Split mit ",", dann Split mit ":"
    Sonderzeichen durch "" ersetzen, fertig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ding ist so ähnlich wie XML, ich suche also einen endsprechenden reader aber ich werde mal versuchen mir selber was zu Programmieren. In Jabascript ist das ding jedoch eine eigenständige klasse, also jede JSON übertragrung ist eine eigene javascript klasse, und in VB.NET habe ich gehört giebt es ein Serialisierer (Serialisieren in eine Object Variable), nur leider komme ich mit diesen Serialisierer sowas von nicht zu recht!!!
    Danke, das ist mal ein sehr konstruktiever vorschlag, ich habe das ding jetzt heruntergeladen und in mein Project integriert, jetzt habe ich eine Warper Klasse geschreiben (wo die logic rein soll) aber ich komme einfach nicht weiter, ich bräuchte mal ein kleines Tutorial :((
    Ok, die übersetung ist schrecklich, wie immer bei Google :D -.-

    Ok, nun zumeigendlichem,

    translate.google.de/translate?…ojects/json/help/&act=url

    ich weiß immer noch nicht wie ich ein JSON Request lesen kann, wie ich es schreiben kann ist scheiß egal, nur das lesen ist wichtig. Und da finde ich leider nix :( :(

    EDIT: Hier mal mein Aktueller Coode der leider nichtFunctioniert :( :(

    VB.NET-Quellcode

    1. Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    2. If (Not Request.QueryString("facebookID") = Nothing) Then
    3. ' Me.fbRed1.Visible = True
    4. Try
    5. Dim DataSurce As String = "https://graph.facebook.com/10000136352074" ' & Request.QueryString("facebookID") '10000136352074
    6. Dim JsonReader As New Global.Newtonsoft.Json.JsonTextReader(New Global.System.IO.StreamReader(DataSurce))
    7. Dim JsonSerialisierer As New Global.Newtonsoft.Json.JsonSerializer
    8. Dim DatenErgenis As Object = JsonSerialisierer.Deserialize(JsonReader)
    9. Me.Label1.Text = DatenErgenis.first_name
    10. Me.Label2.Text = DatenErgenis.last_name
    11. Catch ex As Exception
    12. Me.errorDissplay.Visible = True
    13. Me.Label3.Text = ex.Message
    14. End Try
    15. Else
    16. ' Me.fbRed1.Visible = False
    17. End If
    18. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „zn-gong“ ()

    Sry, also ich bin jetzt hier auf dieser seite:

    james.newtonking.com/projects/json/help/ (translate.google.de/translate?…%2Fjson%2Fhelp%2F&act=url)

    aber ich werdeeinfach nicht schlau drauß, ich sehe da nur einen Writer aber keinen reader, ich brauche da glaube etwas zusätzlichen input oder ich bin zu blöd.
    Kanst du mir ungefähr sagen (habe selber nachgesehen in der doku die du mir geschickt hast) wie man eine Propety ausließt mit den
    JsonTextReader????

    Dane in vohrraus ;))
    Ok so langsam habeich mir meinen Plahngemacht :))

    EDIT:

    Also mein Quelltext siht gerade so aus:

    VB.NET-Quellcode

    1. If (Not Request.QueryString("facebookID") = Nothing) Then
    2. 'Me.fbRed1.Visible = True
    3. Try
    4. Dim DataSurce As String = "https://graph.facebook.com/10000136352074" ' & Request.QueryString("facebookID") '10000136352074
    5. Dim DataRaider As New System.IO.StreamReader(DataSurce)
    6. Dim JsonReader As New Global.Newtonsoft.Json.JsonTextReader(DataRaider)
    7. JsonReader.Read()
    8. Me.Label1.Text = JsonReader.Value
    9. JsonReader.Read()
    10. Me.Label2.Text = JsonReader.Value
    11. Catch ex As Exception
    12. Me.errorDissplay.Visible = True
    13. Me.Label3.Text = ex.Message
    14. End Try
    15. Else
    16. ' Me.fbRed1.Visible = False
    17. End If

    aber leider Functioniert es immer noch nicht :( :( Ich habe versucht den Token zu lesen und dan die Value abzufragen. Aber die Labels sind immer noh unverändert :((

    EDIT2: Ich habe jetzt (glaube ich) das Problehm gefunden, undzwar bekomme ich die Meldung "Das angegebene Pfadformat wird nicht unterstützt.", also dencke ich das es am der URL liegen mus, wie kann ich eine url in ein FilleStream laden??

    VB.NET-Quellcode

    1. Dim DataSurce As String = "https://graph.facebook.com/10000136352074" ' & Request.QueryString("facebookID") '10000136352074
    2. Dim DataRaider As New System.IO.StreamReader(DataSurce)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „zn-gong“ ()

    zn-gong schrieb:

    Ich habe jetzt (glaube ich) das Problehm gefunden, ...
    Warum hasteda so lange gebraucht für?
    Ich vermute mal: wegen des TryCatches.
    Ein TryCatch ist halt prinzipiell eine Code-Struktur, die Debugging erschwert.
    TryCatchens sollteman, wenn irgend möglich vermeiden.

    Und solange du noch am entwickeln bist, erst recht vermeiden, weil man ist ja blöde, sich die Fehlermeldungen weg-catchen zu lassen, wo man doch die Fehler suchen und korrigieren muß.

    gugge AvoidTryCatch

    zn-gong schrieb:

    ... wie kann ich eine url in ein FilleStream laden??
    in diesem Falle garnet.

    Ein FileStream bezieht sich auf ein File auf Platte, nicht auf eine Resource im Internet.
    Auf Internet-Resourcen greift man mit WebRequest oder WebClient zu.

    ErfinderDesRades schrieb:

    Auf Internet-Resourcen greift man mit WebRequest oder WebClient zu.

    Wie EDR schon sagte , entweder WebClient oder httpWebRequest. Letzterer hat den Vorteil , dass man die xmlHttpRequests von Ajax 1:1 simulieren kann.

    Weiterhin ist es bei Feld-Wald-und-Wiesen Projekten noch nicht einmal nötig die JSON.NET Klasse einzubinden, .NET Hausmittel tun es auch ;)

    Gut funktioniert zum Beispiel die JavascriptSerializer Klasse: binde unter .NET 3.5 die Assembly System.Web.Extensions ein und verwende den Serializer entweder mit .Deserialize oder DeserializeObject, was immer Dir sinnvoller erscheint:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim json As String = "{""id"": ""100001363520746"", ""name"": ""Jenni Hapunkt"", ""first_name"": ""Jenni"", ""last_name"": ""Hapunkt"", ""gender"": ""female"",""locale"": ""de_DE"" }"
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    4. ' javascript serialisierer
    5. Dim jsonSerializer As New System.Web.Script.Serialization.JavaScriptSerializer
    6. ' generisch zu json dictionary konvertieren
    7. Dim dict1 As Dictionary(Of String, Object) = jsonSerializer.Deserialize(Of Dictionary(Of String, Object))(json)
    8. ' oder standardmässig über deserializeobject + casten
    9. Dim o As Object = jsonSerializer.DeserializeObject(json)
    10. Dim dict2 As Dictionary(Of String, Object) = DirectCast(o, Dictionary(Of String, Object))
    11. ' ansprechen kann man es jetzt einfach
    12. MessageBox.Show(CStr(dict1("id"))) ' die objekte im dict müssen noch richtig gecastet werden
    13. MessageBox.Show(CStr(dict2("first_name")))
    14. End Sub
    15. End Class

    Andere .NET Alternative ist die DataContractJsonSerializer-Klasse, mit denen auch komplexe Klassen von String in JSON-Objekte umgewandelt werden können. Baut stark auf Attribute auf, ist meiner Meinung nach aber nicht so flexibel wie die o.g. Serializer Klasse.

    ErfinderDesRades schrieb:

    Das hätte ich jetzt auch nicht gedacht,

    Warum nicht ? ASP.NET ist seit 2.0 voll von Klassen zur Ajax-Unterstützung, und das wird ohne JSON kaum gehen. Gerade im Bereich der Client/Server Kommunikation lohnt es sich immer mal in den System.Web Namespace zu schielen.

    Der JavascriptSerializer ist der Vorläufer der Json-Unterstützung und mittlerweile von MS als deprecated gekennzeichnet. Allerdings löst der noch viele Objekte auf, bei denen der DataContractJsonSerializer (weil zu starr) dicke Backen bekommt.
    Also erstmal ich war schon total am Verzweifeln und wollte das Project schon aufgeben, also werde ich mir die Javascript Serialisirungs Klasse mal ansehen, und zweitens brauche ich dringend hilfe beizugriff auf Internet Resurcen. Könnte mr da jemand einen kleinen beispiel Coode machen??

    Vielen Dank, den die letzten beiträge haben mir sehr geholfen!!!!

    EDIT: Falsch, es ist durchaus mögich mit den Streamreader auf Resurcen aus den Internet zuzugreifen, hier der coode (von MSDN)

    VB.NET-Quellcode

    1. ' Coode by Aleksandar Herbrich
    2. ' http://update.zentrix.co.cc
    3. Public Function DownloadWebpage(ByVal URL As String) As String
    4. ' Lädt den Quelltext einer Seite aus dem Inter-/Intranet herunter
    5. ' und liefert ihn als String zurück. Bei Auftreten eines
    6. ' beliebigen Fehlers wird ein leerer String returniert.
    7. Dim IoStream As System.IO.Stream
    8. Dim StrRead As System.IO.StreamReader
    9. Try
    10. ' Einen WebRequest für den URL erzeugen
    11. Dim Request As System.Net.WebRequest _
    12. = System.Net.WebRequest.Create(URL)
    13. ' Die Antwort auf den Request in einen Stream legen
    14. IoStream = Request.GetResponse.GetResponseStream
    15. ' Einen StreamReader erzeugen, der den Stream ausliest
    16. StrRead = New System.IO.StreamReader(IoStream)
    17. ' Den Quellcode des URLs zurückgeben
    18. Return StrRead.ReadToEnd
    19. Catch ex As Exception ' bei beliebigem Fehler
    20. Return vbNullString
    21. Finally
    22. ' StreamReader und Stream in jedem Fall wieder schließen
    23. StrRead.Close()
    24. IoStream.Close()
    25. End Try
    26. End Function



    EDIT2: Hier die Komplette Klasse damit die lösung des Problehms gleichgesinten nicht vorbehallten bleibt!

    VB.NET-Quellcode

    1. Partial Class Site
    2. Inherits System.Web.UI.MasterPage
    3. Public Function DownloadWebpage(ByVal URL As String) As String
    4. ' Lädt den Quelltext einer Seite aus dem Inter-/Intranet herunter
    5. ' und liefert ihn als String zurück. Bei Auftreten eines
    6. ' beliebigen Fehlers wird ein leerer String returniert.
    7. Dim IoStream As System.IO.Stream
    8. Dim StrRead As System.IO.StreamReader
    9. Try
    10. ' Einen WebRequest für den URL erzeugen
    11. Dim Request As System.Net.WebRequest _
    12. = System.Net.WebRequest.Create(URL)
    13. ' Die Antwort auf den Request in einen Stream legen
    14. IoStream = Request.GetResponse.GetResponseStream
    15. ' Einen StreamReader erzeugen, der den Stream ausliest
    16. StrRead = New System.IO.StreamReader(IoStream)
    17. ' Den Quellcode des URLs zurückgeben
    18. Return StrRead.ReadToEnd
    19. Catch ex As Exception ' bei beliebigem Fehler
    20. Return vbNullString
    21. Finally
    22. ' StreamReader und Stream in jedem Fall wieder schließen
    23. StrRead.Close()
    24. IoStream.Close()
    25. End Try
    26. End Function
    27. Public ReadOnly Property rscLo As String
    28. Get
    29. Return Request.QueryString("rscLo")
    30. End Get
    31. End Property
    32. Public ReadOnly Property app As String
    33. Get
    34. Return Request.QueryString("app")
    35. End Get
    36. End Property
    37. Public ReadOnly Property facebookID As String
    38. Get
    39. Return Request.QueryString("facebookID")
    40. End Get
    41. End Property
    42. Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    43. If rscLo = "100001363520746" Then
    44. Me.simpleMessage0.Visible = True
    45. End If
    46. If Not facebookID = Nothing Then
    47. Me.VaildateFacebookAcount()
    48. End If
    49. Select Case Me.app
    50. Case "tiker"
    51. Me.Panel1.Visible = True
    52. End Select
    53. End Sub
    54. Public Sub VaildateFacebookAcount()
    55. Try
    56. Dim json As String = Me.DownloadWebpage("https://graph.facebook.com/" & Me.facebookID & "/") '100001363520746
    57. ' javascript serialisierer
    58. Dim jsonSerializer As New System.Web.Script.Serialization.JavaScriptSerializer
    59. ' generisch zu json dictionary konvertieren
    60. Dim dict1 As Dictionary(Of String, Object) = jsonSerializer.Deserialize(Of Dictionary(Of String, Object))(json)
    61. ' oder standardmässig über deserializeobject + casten
    62. Dim o As Object = jsonSerializer.DeserializeObject(json)
    63. Dim dict2 As Dictionary(Of String, Object) = DirectCast(o, Dictionary(Of String, Object))
    64. ' ansprechen kann man es jetzt einfach
    65. Me.Label2.Text = (CStr(dict1("first_name"))) ' die objekte im dict müssen noch richtig gecastet werden
    66. Me.Label3.Text = (CStr(dict2("last_name")))
    67. Catch ex As Exception
    68. End Try
    69. End Sub
    70. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „zn-gong“ ()

    zn-gong schrieb:

    EDIT: Falsch, es ist durchaus mögich mit den Streamreader auf Resurcen aus den Internet zuzugreifen, hier der coode (von MSDN)

    Du beziehst dich vmtl. auf das hier:

    zn-gong schrieb:

    ... wie kann ich eine url in ein FilleStream laden??
    in diesem Falle garnet.

    Ein FileStream bezieht sich auf ein File auf Platte, nicht auf eine Resource im Internet.

    Da ist die Rede von FileStream, und das ist numal ein Stream für Files.