vb.net Deserialize echonest JSON response
Geizhals » Forum » Programmierung » vb.net Deserialize echonest JSON response (12 Beiträge, 392 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
vb.net Deserialize echonest JSON response
26.12.2014, 17:56:11
Hallo,

ich versuche schon seit einiger Zeit einen JSON Response aus dem echonet Projekt ( http://the.echonest.com/  ) in vb.net zu zerpflücken.

Beispiel Response:
https://forum.geizhals.at/files/203513/response.txt

Längere google Sessions habe ich schon hinter mir - jedoch ohne Erfolg!
Bitte keine C# Codes da ich die Erfahrung gemacht habe, das die Konverter nicht immer zum Ziel führen.

Ziel wäre es den Response via Foreach zu deserialisieren und am besten in ein für mich verdauliches Format z.B. Listview Item mit subitems oder einem Array oder ähnliches zu übersetzen.

z.B.:
        Dim lvResponse As ListView
        lvResponse = New ListView
        lvResponse.Columns.Add("Index")
        lvResponse.Columns.Add("Score")
        lvResponse.Columns.Add("Title")
        lvResponse.Columns.Add("Message")
        lvResponse.Columns.Add("ArtistID")
        lvResponse.Columns.Add("Artist")
        lvResponse.Columns.Add("ID")



der erste Schritt (deserialize) ist ja noch einfach:

Dim dict = jss.Deserialize(Of Dictionary(Of String, Object))(JSON)
Wobei "JSON" ein String ist der den Response enthält.

Zurück bekomme ich folgende Struktur -> Siehe Bild


Vielleicht kann mir jemand erklären/zeigen wie man sich in so einem JSON Response via ForEach oder ähnlichem bewegt und die Daten richtig abfragt?!

Für Ansätze wäre ich dankbar!

<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->

Sagte ich ja schon ... wasined :-)
Antworten PM Übersicht Chronologisch
 
Melden nicht möglich
.
Re: vb.net Deserialize echonest JSON response
27.12.2014, 08:33:20
Zuerst brauchst du Klassen welche die JSON Objekte repräsentieren. Die musst du nicht manuell erstellen, es gibt EDIT->Paste Special->Paste as Json classes. Wenn du keine web extensions in VS hast gibt es Alternativen:
http://json2csharp.com/
https://jsonclassgenerator.codeplex.com/
Die letzten beiden Methoden sind C# spezifisch, wie rund 90% aller .net Ressourcen, weswegen du lieber gleich C# statt VB.net lernen solltest. Die einfachen JSON Klassen sollte aber jeder Konverter schaffen. Schlimmstenfalls kannst du die Klassen zu einer .dll kompilieren und dir den garantiert richtigen VB.net Code mittels ILSPY holen.

In deinem Fall also:


Public Class Rootobject
	Public Property response() As Response
End Class

Public Class Response
	Public Property status() As Status
	Public Property songs() As Song()
End Class

Public Class Status
	Public Property version() As String
	Public Property code() As Integer
	Public Property message() As String
End Class

Public Class Song
	Public Property tag() As Integer
	Public Property [error]() As String
	Public Property score() As Integer
	Public Property title() As String
	Public Property message() As String
	Public Property artist_id() As String
	Public Property artist_name() As String
	Public Property id() As String
End Class


Jetzt hast du deine Klassen.

Nun brauchst du eine Referenz auf System.Web.Extensions und rufst dann folgendes auf.

(json ist hier ein String)

Imports System.Web.Script.Serialization
Dim rootObject As Rootobject = New JavaScriptSerializer().Deserialize(Of Rootobject)(json)


Das Objekt ist sehr logisch aufgebaut und du solltest es mittels Debugger sofort verstehen:
Beispiel zur Anwendung:

		If (rootObject.response.status.code = 0) Then
			For Each song As Song In rootObject.response.songs
				Console.WriteLine(song.title)
			Next
		End If


test
27.12.2014, 08:38 Uhr - Editiert von Diabolo2000, alte Version: hier
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..
Re(2): vb.net Deserialize echonest JSON response
05.01.2015, 13:12:23
Darf ich dich vielleicht nochmals um Hilfe bitten?

Nachdem ich leider VIEL zu spät erfahren habe das das "identifying" von Echonest ersatzlos mit heute eingestellt wird, musste ich mich um Alternativen umsehen.


Das neue Service hat natürlich eine komplett andere Struktur:
https://forum.geizhals.at/files/203513/response.txt

Dokumentation dazu:
https://acoustid.org/webservice  


Ich habe wie du mir gelernt hast die Klassen dazu aus dem JSON erstellt:

Public Class Rootobject
    Public Property status As String
    Public Property results() As Result
End Class

    Public Class Result
        Public Property score As Single
        Public Property id As String
        Public Property recordings() As Recording
    End Class

    Public Class Recording
        Public Property duration As Integer
        Public Property releasegroups() As Releasegroup
        Public Property title As String
        Public Property id As String
        Public Property artists() As Artist
    End Class

    Public Class Releasegroup
        Public Property type As String
        Public Property id As String
        Public Property title As String
    End Class

    Public Class Artist
        Public Property id As String
        Public Property name As String
    End Class


Und das ganze dann wieder deserialisiert:
Dim rootObject As Rootobject = New JavaScriptSerializer().Deserialize(Of Rootobject)(json)

Leider wirft mir schon der deserializier schon eine Exception:

Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Web.Extensions.dll aufgetreten.

Zusätzliche Informationen: Der Typ "MusicFind.Form1+Result" wird für die Deserialisierung eines Arrays nicht unterstützt.

Was mache ich falsch?

Ist zwar nicht Punkt der Diskussion - aber ich verstehe nicht wieso der Response überhaupt ein Array sein soll - weil im Gegensatz zu dem ersten Beispiel gibt er immer nur EIN File(Song retour).
Aber egal - "ER" will es halt so ;-)

lg
wasined

<-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><-><->

Sagte ich ja schon ... wasined :-)
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung