Äquivalent von json.loads in C#?

  • Python

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Gräfin_Koks.

    Äquivalent von json.loads in C#?

    Hallo zusammen,

    ich hoffe, dieses Thema gehört an diese Stelle des Forums.

    Ich habe mir folgendes Projekt angesehen: github.com/m-wrzr/populartimes und möchte so in C# verfahren. Das ist ein Projekt, um die Stoßzeiten von Orten herauszufiltern. Da, wo ich aber jetzt so richtig hänge, ist das Verarbeiten von dem, was ich schließlich zurückbekomme. Ich kriege zum Beispiel folgendes (s. Anhang, da es sonst den Rahmen gesprengt hätte), wenn ich die Stoßzeiten von Lucky's Luke in Trier haben möchte.

    Die searchURL ist bei mir dann folgende:

    Quellcode

    1. https://www.google.de/search?&tbm=map&tch=1&q=Lucky%27s+Luke+Luxemburger+Str.+6%2c+54294+Trier%2c+Germany&pb=!4m12!1m3!1d4005.9771522653964!2d-122.42072974863942!3d37.8077459796541!2m3!1f0!2f0!3f0!3m2!1i1125!2i976!4f13.1!7i20!10b1!12m6!2m3!5m1!6e2!20e3!10b1!16b1!19m3!2m2!1i392!2i106!20m61!2m2!1i203!2i100!3m2!2i4!5b1!6m6!1m2!1i86!2i86!1m2!1i408!2i200!7m46!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e3!2b0!3e3!1m3!1e4!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e3!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!2b1!4b1!9b0!22m6!1sa9fVWea_MsX8adX8j8AE%3A1!2zMWk6Mix0OjExODg3LGU6MSxwOmE5ZlZXZWFfTXNYOGFkWDhqOEFFOjE!7e81!12e3!17sa9fVWea_MsX8adX8j8AE%3A564!18e15!24m15!2b1!5m4!2b1!3b1!5b1!6b1!10m1!8e3!17b1!24b1!25b1!26b1!30m1!2b1!36b1!26m3!2m2!1i80!2i92!30m28!1m6!1m2!1i0!2i0!2m2!1i458!2i976!1m6!1m2!1i1075!2i0!2m2!1i1125!2i976!1m6!1m2!1i0!2i0!2m2!1i1125!2i20!1m6!1m2!1i0!2i956!2m2!1i1125!2i976!37m1!1e81!42b1!47m0!49m1!3b1


    //Edit: Die searchURL funktioniert, die Frage bezieht sich allein auf die Rückgabe, aus der ich die statistischen Besuchszahlen in der Stunde pro jeweiligen Tag bekomme.

    Das ist ja kein für mich direkt brauchbares Format. In Python wird es dann mit json.loads aufgelöst, ich habe aber noch nichts gefunden, womit ich das in C# ersetzen kann. Dazu muss ich sagen, dass ich mich mit Python im Allgemeinen nicht wirklich auskenne.

    Vielleicht weiß ja einer von euch da weiter.

    Vielen Dank im Voraus :)
    Gräfin_Koks
    Dateien
    • Response.txt

      (60,32 kB, 161 mal heruntergeladen, zuletzt: )
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gräfin_Koks“ ()

    Also ich verstehe das noch nicht so ganz, aber vielleicht hilft dir das ja schon ein bisschen.

    Du kannst zu den Verweisen in deinem Projekt die System.Runtime.Serialization hinzufügen:


    und dann so die searchURL bekommen:

    C#-Quellcode

    1. class Program {
    2. static void Main(string[] args) {
    3. string responseFromSomwhere = File.ReadAllText("./Response.txt", Encoding.Default);
    4. GoogleRespose response = null;
    5. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(responseFromSomwhere))) {
    6. response = (GoogleRespose)new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(GoogleRespose)).ReadObject(ms);
    7. }
    8. string searchURL = response.u;
    9. }
    10. }
    11. public class GoogleRespose {
    12. public int c { get; set; }
    13. public string d { get; set; }
    14. public string e { get; set; }
    15. public bool p { get; set; }
    16. public string u { get; set; }
    17. }


    Oder willst du gar nicht die searchURL sondern was anders?
    Ok, ich glaube ich habe mich nicht ganz deutlich ausgedrückt.
    Ziel ist es ja, die Stoßzeiten bzw. die statistischen Besuchszahlen pro Stunde/Tag herauszubekommen. Darum geht es mir hier auch.
    Die searchURL funktioniert ja, sie macht, was sie soll. Ich bekomme aber die Rückgabe aus dem Anhang von Post #1 nicht so auseinandergepflückt, dass ich an gewünschte Daten komme.
    Im Python-Quellcode langt es, json.loads() zu nutzen, und dafür wollte ich jetzt etwas vergleichbares in C# finden.

    Quellcode

    1. gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
    2. resp = urllib.request.urlopen(urllib.request.Request(url=search_url, data=None, headers=user_agent), context=gcontext)
    3. data = resp.read().decode('utf-8')
    4. # find eof json
    5. jend = data.rfind("}")
    6. if jend >= 0: data = data[:jend + 1]
    7. jdata = json.loads(data)["d"]
    8. jdata = json.loads(jdata[4:])
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

    Gräfin_Koks schrieb:

    und dafür wollte ich jetzt etwas vergleichbares in C# finden


    Ok, also entweder benutzt du eine Library für das JSON z.B. Json.NET und bekommst dann ein dynamisches Objekt mit dem du arbeiten kannst oder verwendest, wie bereits oben von mir beschreieben den DataContractJsonSerializer. Dafür müsstest du eigentlich dann die Struktur der JSON Datei mit Klassen abbilden. Das wäre dann wie json.loads().

    Als Beispiel habe ich das gerade aber einfach mal in ein Object-Array geladen. popularTimes hält jetzt die 7 Wochentage. Darin befinden sich ein 3-Element Array, bei dem das mittlere ein Array variabler göße ist, dass dann jeweils die Stunden repräsentiert. Darin sind wieder 5 Elemente, von denen ich mir nicht ganz sicher bin was diese genau bedeuten. Das müsste man aus dem Python-Skript mal genauer auslesen?.



    C#-Quellcode

    1. class Program {
    2. static void Main(string[] args) {
    3. string responseFromSomwhere = File.ReadAllText("./Response.txt", Encoding.UTF8);
    4. GoogleRespose response = null;
    5. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(responseFromSomwhere))) {
    6. response = (GoogleRespose)new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(GoogleRespose)).ReadObject(ms);
    7. }
    8. dynamic layer0 = null;
    9. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(response.d.Substring(4)))) {
    10. layer0 = (object[])new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(object[])).ReadObject(ms);
    11. }
    12. object[] popularTimes = layer0[0][1][0][14][84][0];
    13. }
    14. }
    15. public class GoogleRespose {
    16. public int c { get; set; }
    17. public string d { get; set; }
    18. public string e { get; set; }
    19. public bool p { get; set; }
    20. public string u { get; set; }
    21. }


    Hilft das weiter oder rede ich nur Stuss :) ?
    Nein, du redest keinen Stuss :)
    Ich krieg jetzt nur an der Stelle

    C#-Quellcode

    1. using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(responseFromSomwhere)))
    2. {
    3. response = (GoogleRespose)new DataContractJsonSerializer(typeof(GoogleRespose)).ReadObject(ms);
    4. }

    folgende Fehlermeldung, mit der ich irgendwie nicht viel anfangen kann:
    System.Runtime.Serialization.InvalidDataContractException: "Der Typ "popularTimesCrawler.Program+GoogleRespose" kann nicht serialisiert werden. Kennzeichnen Sie ihn ggf. mit dem Attribut "DataContractAttribute", und kennzeichnen Sie alle zu serialisierenden Member des Typs mit dem Attribut "DataMemberAttribute". Wenn es sich bei dem Typ um eine Sammlung handelt, markieren Sie ihn ggf. mit dem CollectionDataContractAttribute. Weitere Informationen über andere unterstützten Typen finden Sie in der Microsoft .NET Framework-Dokumentation."


    Kam das bei dir auch, bzw. weißt du was damit anzufangen? Die Response.txt liegt jedenfalls im richtigen Ordner und wird auch eingelesen.

    //Edit: Ich hab die Lösung gefunden, woran es jetzt noch hing. Vielleicht auch noch interessant für andere, die auf das gleiche Problem stoßen. Die Class GoogleResponse muss so aussehen:

    C#-Quellcode

    1. [DataContract]
    2. public class GoogleResponse
    3. {
    4. [DataMember]
    5. public int c { get; set; }
    6. [DataMember]
    7. public string d { get; set; }
    8. [DataMember]
    9. public string e { get; set; }
    10. [DataMember]
    11. public bool p { get; set; }
    12. [DataMember]
    13. public string u { get; set; }
    14. }


    @Bluespide Wirklich vielen, vielen Dank, jetzt hat das Kopfzerbrechen ein Ende ^^
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gräfin_Koks“ ()