Json parsen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Hallo,

    Okay, ichmerk schon, so komme ich nicht weiter. Bin ja bei euch, erst die Basics kennen zu müssen. Mein plan war, mir diese irgendwie selbst anhand von Code beizubringen und diesen dann Stück für Stück zu verstehen.

    Habt ihr denn einen Tip für mich, wie ich besser starten könnte?
  • Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    matz schrieb:

    Wenn deine Ausgabe ein Dictionary ist, bringts auch nichts das in nem Array zu speichern. Schau dir mal zu Dictionaries objectForKey und valueForKey an


    er speicherts trotzdem nicht in einem array. er kann da auch NSNString * schreiben und bekommt trotzdem ein NSDictionary (Obj-C basics)


    Ich habe das neue Zeug noch nicht benutzt aber wo steht dann da was von einem Dictionary?

    Quellcode

    1. Returns a Foundation object from given JSON data.
    2. + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error


    Gruß

    Claus


    ich auch nicht, ich hab mir aber die mühe gemacht in die doku zu schauen.

    The top level object is an NSArray or NSDictionary.


    Das bezog ich aber nur aufs write nicht aufs read. Sprich, ich kann nur Array und Dicts codieren die die darunter noch aufgeführten Bedingungen erfüllen. Das ein Foundation object zwangsweise ein Dict ist konnte ich nirgendwo finden.

    Gruß

    Claus


    was ist daraus der umkehrschluss?



    Alle Vögel fliegen. Was ist darauf der Umkehrschluß? Alles was fliegt ist ein Vogel? ;)

    Gruß

    Claus


    alles was nicht fleigt ist kein vogel. aber die aussage dass alle vögel fliegen stimmt ja auch nicht ;)

    nein, aber wenn du nur nsarray und dictionray codieren kannst, dann erwartet man auch nichts anderes decodiert zu bekommen oder erwartest du da ülötzlich nssets, nsindexsets oder sonstwas?
  • Communicate schrieb:

    Hallo,

    Okay, ichmerk schon, so komme ich nicht weiter. Bin ja bei euch, erst die Basics kennen zu müssen. Mein plan war, mir diese irgendwie selbst anhand von Code beizubringen und diesen dann Stück für Stück zu verstehen.

    Habt ihr denn einen Tip für mich, wie ich besser starten könnte?


    die bücher auch lesen die du bereits hast (und zwar so, dass du sie verstehst. eventuell mehrfach lesen die abschnitte bis sie klar sind).
  • gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    matz schrieb:

    Wenn deine Ausgabe ein Dictionary ist, bringts auch nichts das in nem Array zu speichern. Schau dir mal zu Dictionaries objectForKey und valueForKey an


    er speicherts trotzdem nicht in einem array. er kann da auch NSNString * schreiben und bekommt trotzdem ein NSDictionary (Obj-C basics)


    Ich habe das neue Zeug noch nicht benutzt aber wo steht dann da was von einem Dictionary?

    Quellcode

    1. Returns a Foundation object from given JSON data.
    2. + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error


    Gruß

    Claus


    ich auch nicht, ich hab mir aber die mühe gemacht in die doku zu schauen.

    The top level object is an NSArray or NSDictionary.


    Das bezog ich aber nur aufs write nicht aufs read. Sprich, ich kann nur Array und Dicts codieren die die darunter noch aufgeführten Bedingungen erfüllen. Das ein Foundation object zwangsweise ein Dict ist konnte ich nirgendwo finden.

    Gruß

    Claus


    was ist daraus der umkehrschluss?



    Alle Vögel fliegen. Was ist darauf der Umkehrschluß? Alles was fliegt ist ein Vogel? ;)

    Gruß

    Claus


    alles was nicht fleigt ist kein vogel. aber die aussage dass alle vögel fliegen stimmt ja auch nicht ;)

    nein, aber wenn du nur nsarray und dictionray codieren kannst, dann erwartet man auch nichts anderes decodiert zu bekommen oder erwartest du da ülötzlich nssets, nsindexsets oder sonstwas?


    Ich hätte einen Parser besser gefunden wie bei NSXMLParser. Aber das wäre sicher zuviel Arbeite gewesen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    matz schrieb:

    Wenn deine Ausgabe ein Dictionary ist, bringts auch nichts das in nem Array zu speichern. Schau dir mal zu Dictionaries objectForKey und valueForKey an


    er speicherts trotzdem nicht in einem array. er kann da auch NSNString * schreiben und bekommt trotzdem ein NSDictionary (Obj-C basics)


    Ich habe das neue Zeug noch nicht benutzt aber wo steht dann da was von einem Dictionary?

    Quellcode

    1. Returns a Foundation object from given JSON data.
    2. + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error


    Gruß

    Claus


    ich auch nicht, ich hab mir aber die mühe gemacht in die doku zu schauen.

    The top level object is an NSArray or NSDictionary.


    Das bezog ich aber nur aufs write nicht aufs read. Sprich, ich kann nur Array und Dicts codieren die die darunter noch aufgeführten Bedingungen erfüllen. Das ein Foundation object zwangsweise ein Dict ist konnte ich nirgendwo finden.

    Gruß

    Claus


    was ist daraus der umkehrschluss?



    Alle Vögel fliegen. Was ist darauf der Umkehrschluß? Alles was fliegt ist ein Vogel? ;)

    Gruß

    Claus


    alles was nicht fleigt ist kein vogel. aber die aussage dass alle vögel fliegen stimmt ja auch nicht ;)

    nein, aber wenn du nur nsarray und dictionray codieren kannst, dann erwartet man auch nichts anderes decodiert zu bekommen oder erwartest du da ülötzlich nssets, nsindexsets oder sonstwas?


    Ich hätte einen Parser besser gefunden wie bei NSXMLParser. Aber das wäre sicher zuviel Arbeite gewesen.

    Gruß

    Claus


    gibts ja auch - nur eben nicht von apple.

    schau mal in die doku wie lange apple gebraucht hat die verschiedenen XML Parser in Cocoa zu integrieren... da waren sie mit JSON ganz schön fix ;)
  • gritsch schrieb:

    gibts ja auch - nur eben nicht von apple.

    schau mal in die doku wie lange apple gebraucht hat die verschiedenen XML Parser in Cocoa zu integrieren... da waren sie mit JSON ganz schön fix ;)


    Stimmt sie schaffe es ja nichtmal ihren bereits existierenden MapKit Code für iOS in OSX zu integrieren. Dabei sollte das wirklich nur eine Arbeit von 1h sein. Aber wahrscheinlich ist das eine politische Entscheidung.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Da bin ich wieder :)

    so, folgender code

    Quellcode

    1. NSLog (@"Number of name in dictionary = %lu", [mein_arr count]);
    2. id kvcValue = [mein_arr valueForKey:@"params"];
    3. NSLog(@"KVC :%@",kvcValue);


    bringt mir folgendes Ergebnis:

    Quellcode

    1. KVC :{
    2. "_session_id_" = 6ROw2QZITJ;
    3. interface = "BidCos-RF";
    4. }



    Also schonmal einen Schritt weiter,

    Aber wie komme ich denn jetzt an die Daten, die mir curl liefert?
    Oder bin ich echt zu doof?

    Hier nochmal die Curl-Ausgabe:

    Quellcode

    1. {"version": "1.1","result": [{"name":"UNKNOWN","partner": [{"name":"JEQ0039940","rssiData":[-43,65536]},{"name":"JEQ0049593","rssiData":[-41,65536]}]},{"name":"IEQ0173109","partner": [{"name":"IEQ0171822","rssiData":[-51,65536]},{"name":"IEQ0380788","rssiData":[65536,-47]}]},{"name":"IEQ0171822","partner": [{"name":"IEQ0173109","rssiData":[65536,-51]},{"name":"IEQ0380788","rssiData":[65536,-72]}]},{"name":"JEQ0039940","partner": [{"name":"UNKNOWN","rssiData":[65536,-43]},{"name":"IEQ0380788","rssiData":[65536,-72]}]},{"name":"IEQ0380788","partner": [{"name":"IEQ0173109","rssiData":[-47,65536]},{"name":"IEQ0171822","rssiData":[-72,65536]},{"name":"JEQ0039940","rssiData":[-72,65536]},{"name":"JEQ0049593","rssiData":[-72,65536]}]},{"name":"JEQ0049593","partner": [{"name":"UNKNOWN","rssiData":[65536,-41]},{"name":"IEQ0380788","rssiData":[65536,-72]}]}],"error": null}



    Habt Ihr noch nen Tip für mich?
  • gritsch schrieb:

    indem du die gleiche anfrage sendest. in der curl ausgabe gibts kein "params". also arbeitest du wohl auf verschiedenen werten. also gib doch einfach mal den string/data aus.
    hmm. was meinst du denn jetzt damit? Welchen data/string soll ich denn wie ausgeben?

    Ich drück mich mal laienhaft aus, was ich glaube jetzt passiert ist.

    Curl interpretiert meine json xml datei sendet diese an den Server und liefert mir das Ergebnis der json anfrage.

    Mit meine Obj-C Code lese ich die json xml datei ein, sendet diese aber nicht zum Server. die json Datei besteht ja nur aus diesen beiden werten (method und params).

    ... Aber an welcher stelle ich jetzt falsch bin, krieg ich einfach nicht raus...
  • Nun gut,

    ich danke Dir für Dein Geduld. EIn bisschen schade ist es zwar, aber was soll ich machen.
    Ich werde weiter meine Bücher lesen und wohl erstmal in der Theorie leben.

    Mein Ansatz, mir eine konkrete Aufgabe zu suchen und dann einfach loszulegen (vielleicht auch mit viel
    Code kopieren und ausprobieren und testen und und und) um mehr Spass daran zu haben, scheint
    hier nicht gewünscht und vielleicht (das will ich gar nicht ausschliessen) auch nicht der richtige zu sein...

    Vielen Dank nochmal für Eure Antworten.

    Grüße
    Ein, doch ziemlich entmutigter Anfänger...
  • Mit curl schickst du die xml an den Server, im Code holst du sie.
    Dann muss man sich auch nicht wundern wenn nicht die erwarteten Werte drin stehen.
    Du hast den Server auf dem localhost laufen, kontrollier doch mal was du da machst.


    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • das hab ich mir jetzt auch gedacht.

    aber meine herausforderung ist ja folgende:

    ich habe eine json (Abruf.xml) auf dem localhost.

    diese muss an einen Server 192,168.178.107 geschickt und das zurückgegebene Ergebnis dann von meinem Code interpretiert
    werden.

    Eigentlich dachte ich, ich war auf dem richtigen weg,aber das ich genau falsch herum arbeite, hatte ich nicht gedacht.

    Ich weiss auch nicht, wie ich das Problem lösen kann. Beispielcode bekomme ich keinen (was ich ja auch nachvollziehen kann, schliesslich muss ich es ja lernen)
    und einfach nur reine theorie lernen ist halt einfach recht abstrakt und schwierig in die Praxis umzusetzen...
  • Wie du die xml vom lcalhost lädst weist du jetzt ja. ;)

    Für den Rest empfehle ich die Referenz von NSURLRequest und NSURLConnection sowie den "URL Loading System Programming Guide" auf den beide Klassen verweisen.

    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • @Communicate: Ein Tipp von mir persönlich: Fange besser nicht mit JSON oder irgendwas in diese Richtung an als Herausforderung. Diese Herausforderung wird hier von Anfängern tausend mal versucht und 99,9 % sind damit gescheitert und nix draus schlau geworden. Es ist wirklich langweilig, ständig mit JSON zu beschäftigen. Fange besser mit Katas an, versuch paar Katas zu lösen mit Objective C.

    Fange an mit der Reihefolge:
    1. FizzBuzz: codingdojo.org/cgi-bin/wiki.pl?KataFizzBuzz
    2. Potter: codingdojo.org/cgi-bin/wiki.pl?KataPotter
    3. OCR: codingdojo.org/cgi-bin/wiki.pl?KataBankOCR

    Dann kriegst du tausend Mal bessere Verständnis wie NSDictionary, NSArray, etc. funktionieren.

    Viel Spass! Falls du Probleme hast bei diesen Katas, kannst du gern hier fragen mit deinem Code zusammen,
    wo du uns sagst, was genau dein Problem ist etc. und wir alle helfen dir dann gerne! Dann irgendwann
    sagst du, dass deine Herausforderung mit JSON nur lächerlich ist.
    Aus macfreakz wurde Apfelbeisser …
  • vielen Dank fpr den Tip. Das werde ich beherzigen.

    So ganz lässt mich json aber nicht los :)

    Habe jetzt folgenden Code:

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. int main(int argc, const char * argv[])
    3. {
    4. @autoreleasepool {
    5. // insert code here...
    6. // {"method": "Session.login","params": { "username" : "Admin", "password" : ""}}
    7. NSString *myJson = @"{\"username\":\"Admin\",\"password\":\"\"}}";
    8. NSLog(@"%@", myJson);
    9. NSString *username = @"Session.login";
    10. NSString *password = @"{username:Admin,password:";
    11. NSMutableDictionary *dictionnary = [NSMutableDictionary dictionary];
    12. [dictionnary setObject:username forKey:@"method"];
    13. [dictionnary setObject:password forKey:@"params"];
    14. //[dictionnary setObject:password forKey:@"params"];
    15. NSError *error = nil;
    16. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionnary
    17. options:kNilOptions
    18. error:&error];
    19. NSString *jsonData1 = [NSString stringWithCString:[jsonData bytes]];
    20. NSLog(@"%@", jsonData1);
    21. NSString *urlString = @"http://192.168.178.107/api/homematic.cgi";
    22. NSURL *url = [NSURL URLWithString:urlString];
    23. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    24. [request setHTTPMethod:@"POST"];
    25. [request setHTTPBody:jsonData];
    26. NSURLResponse *response = NULL;
    27. NSError *requestError = NULL;
    28. NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];
    29. NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ;
    30. NSLog(@"%@", responseString);
    31. }
    32. }
    Alles anzeigen



    Und folgendes Problem:

    jsonData



    sollte aussehen wie:


    {"method": "Session.login","params": { "username" : "Admin", "password" : ""}}



    Leider sagt mir nslog, dass es so aussieht:


    {"method":"Session.login","params":"{\"username\":\"Admin\",\"password\":\"\"}}"}


    Habe ich da mit dem escapen auch was falsch verstanden?


    Vielleicht hilft mir ja nochmal einer :-)




  • Du verwendest eine falsche Objekt-Struktur.

    Wenn Dein JSON String so "{"method": "Session.login","params": { "username" : "Admin", "password" : ""}}" aussehen soll, dann musst Du folgende Objekt-Struktur verwenden:

    Quellcode

    1. NSDictionay
    2. - key: "method" object: @"Session.login"
    3. - key: "params" object: NSDictionary
    4. - key: "username" object: @"Admin"
    5. - key: "password" object: @""

    Du solltest auf keinen Fall fertige "JSON Syntax" beim Erstellen der Objekt-Struktur verwenden, also nicht einfach @"{username:Admin,password:" als Text innerhalb der Objekt-Struktur verwenden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • ... und da war wieder mein Unwissenheitsproblem...

    Ich dachte bislang, das ein dictionary immer nur ein object - key paar hat.

    Du sagst jetzt, dass es auch ein key - value paar geben kann. WIe soll ich das denn jetzt umsetzen?

    ein einfaches

    Quellcode

    1. [dictionnary setObject:@"method" forKey:@"Session.login"];
    2. [dictionnary setObject:@"params" forKey:@"test"];

    Ist ja genau verkehrt herum, oder?
    Zumindest ist die NSLog ausgabe dann folgende:
    {"test":"params","Session.login":"method"}

    Kannst Du mir nochmal helfen?