Json parsen

  • Hallo zusammen,

    ich bin ganz neu in der Xcode-Programmierung und mache gerade meine ersten Schritte.

    Ich versuche per json daten in ein Array zu übertragen.

    Genau gesagt, versuche ich folgendes (hier ein Beispiel ohne Xcode):

    Ich rufe per curl die xml datei abruf.xml auf:
    curl --data-ascii @abruf.xml 192.168.178.107


    Ergebnis ist dann

    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]}]}


    usw. und so fort.

    die abruf xml sieht wie folgt aus:

    Quellcode

    1. { "method": "Interface.rssiInfo", "params": { "interface" : "BidCos-RF", "_session_id_" : "SoM8kHsRCV" } }



    In Xcode habe ich folgendes probiert:

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. int main(int argc, const char * argv[])
    3. {
    4. @autoreleasepool {
    5. // insert code here...
    6. NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8888/abruf.xml"]];
    7. NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    8. NSError *jsonParsingError = nil;
    9. NSArray *mein_arr = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];
    10. for (id obj in mein_arr )
    11. NSLog(@"%@", obj);
    12. }
    13. return 0;
    14. }
    Alles anzeigen



    Ergebnis in der Debug-Konsole:

    2012-11-19 21:33:02.911 tesj[12124:303] method

    2012-11-19 21:33:02.913 tesj[12124:303] params





    Warum erhalte ich hier eine so absolut abweichende Ausgabe im vergleich zu meinem Curl Abruf?


    Kann mir jemand helfen???
  • gritsch schrieb:

    du musst die basics lernen. mit NSLog kannst du dir das Dict ausgeben lassen.
    Da hast Du bestimmt recht. Hab hier mittlerweile 5 Bücher liegen und unzählige tutorials gelesen.

    Das Thema Json und Ausgabe ist leider nirgends so richtig für Anfänger erklärt. Also versuch ich es mit try and error.

    Und an der Stelle, dass er mir nicht das ausgibt, was ich erwartet hätte, scheitere ich jetzt :(

    Kannst Du Dir nen Ruck geben und mir vielleicht doch mit nem konkreten Codeblock helfen?
  • gritsch schrieb:

    da gehts auch nicht um json sondern darum dass du da ein dictionary bekommst und nicht ein array wie du vermutestet. und wie man dictionaries loggt, of die keys und values zugreift etc steht in der doku dazu - bringt ja nix wenn ich dir fertigen code gebe...)


    Naja da hast du Unrecht. Natuerlich bringt ihm das was. Er braucht es nicht zu lernen :D

    SCNR

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • ... "er will ja lernen" nur verzweifelt er an dieser Stelle.

    Vielleicht bin ich einfach zu doof, aber wie ist denn das Dictionary dann aufgebaut?

    Erwartet hätte ich eine Struktur wie folgt:

    method: Interface.rssiInfo
    params: "name":"JEQ0039940"
    "rssiData":[-43,65536]


    Aber was davon ist jetzt mein key und was mein value?
    Mein COde liefert mir ja nur method und params zurück. Ich will ja aber die werte von (im obigen Beispiel) name und rssiData.
  • Hallo,

    Erstmal vielen Dank für deine Hilfe.
    Das hilft schonmal ungemein. Was ich aber einfach nicht verstehe ist, wie ich jetzt auf die einzelnen Werte zugreifen kann. Gibt es denn einen Code, der mir das dict offenlegt und den gesamten Inhalt nach Hierarchie darstellt?

    Gruß Dominic
  • Sitze gerade nicht vorm Mac. Laut Doku müsste ich ja mit allkeys spielen können.

    Also in etwa so:

    Quellcode

    1. NSArray*mein_arr =[dict allkeys];
    2. for (id obj in mein_arr ) NSLog(@"%@", obj);

    Wäre das dann korrekt und ich wurde an die keys kommen, mit denen ich dann auf die Werte zugreifen kann?
    Was ich immer noch nicht verstanden habe ist, dass ich mit

    Quellcode

    1. NSArray *mein_arr = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];


    Ja eigentlich ein array erzeugt habe. Warum wird das dann zum Dictionary?

    Fragen über Fragen... ?(
  • Communicate schrieb:

    Sitze gerade nicht vorm Mac. Laut Doku müsste ich ja mit allkeys spielen können.

    Also in etwa so:

    Quellcode

    1. NSArray*mein_arr =[dict allkeys];
    2. for (id obj in mein_arr ) NSLog(@"%@", obj);

    Wäre das dann korrekt und ich wurde an die keys kommen, mit denen ich dann auf die Werte zugreifen kann?
    Was ich immer noch nicht verstanden habe ist, dass ich mit

    Quellcode

    1. NSArray *mein_arr = [NSJSONSerialization JSONObjectWithData:response options:0 error:&jsonParsingError];


    Ja eigentlich ein array erzeugt habe. Warum wird das dann zum Dictionary?

    Fragen über Fragen... ?(



    NSLog gibt dir ja die komplette hirarchie aus!

    nein, warum ein NSArray? Lies doch die doku. und wenn du das JSON anschaust dann siehst du auch dass es ein dict sein muss und kein array.

    in dem code werden wieder nur die keys geloggt. wie man an die dazugehörigen objekte kommt steht aber wirklich in der doku!
  • 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
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • 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.
  • 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
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • 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?
  • 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)


    Das meinte ich eigentlich damit! Wusst nur nicht wie ich mich klar ausdrücken soll ;)

    In der Doku steht the top level object is an nsarray or nsdictionary

    Edit: hast du ja schon geschrieben
  • 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
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)