Probleme mit JSON

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

  • Probleme mit JSON

    Hallo Community,

    ich komme nicht weiter und habe einen Knoten im Kopf -.-
    Folgender Fall:
    Ich parse Daten von einem Webservice (JSON) in ein Array.
    Ein View mit einer Tableview zeigt mir vorerst die Titel der Nachrichten vom Webservice an.
    Wenn ich auf eines dieser Titel klicke, öffnet sich eine DetailView, die dann eben die Nachricht detailiert anzeigen soll.
    Jetzt kommt das Problem.


    • Es gibt 2 Möglichkeiten es zu realisieren. Ich ändere die URL im Code für den Webservice (Parameterabhängigkeit) dynamisch ab. (abhängig von der Auswahl der Titel) Somit kriege ich nur den Content, der überhaupt angezeigt werden soll. (Problem: interne Komplikationen des Webservices, somit erst möglich, wenn ich den Webservice umändere => momentan kein Zugriff)



    • 2. Möglichkeit wäre den geparsten Webservice im Array direkt zu bearbeiten. Aber ich komme hier nicht auf einen grünen Zweig. Wie kann ich es filtern?


    Code für den Parse Vorgang:

    Quellcode

    1. //webservice
    2. NSString *urlString = [NSString stringWithFormat:@"http://www2.hs-augsburg.de/infoterm-fki-test/Webservice/ClientService.php?GetMessages=1,2,3,4,5,6,7,8,9,11,1000,1001,1002,1003,25,31"];//static url for news
    3. // NSString *urlString = tempString;
    4. NSURL *url = [NSURL URLWithString:urlString];
    5. //parser need nsdata object
    6. NSData *data = [NSData dataWithContentsOfURL:url];
    7. //check error
    8. NSError *error;
    9. //cast to array
    10. newsJson = (NSMutableArray*)[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
    Alles anzeigen


    Code für CellForRowAtIIndex:

    Quellcode

    1. // Configure the cell...
    2. NSDictionary *cellValue = [newsJson objectAtIndex:indexPath.row];
    3. customCell.textLabel.text =[cellValue objectForKey:@"CONTENT"];


    Webserviceaufbau (Ausgabe):
    [{"CONTENT":"An old man was wondering if his wife had a hearing problem.\rSo one night, he stood behind her while she was sitting in her lounge chair.\rHe spoke softly to her, \"Honey, can you hear me?\"\rThere was no response.\rHe moved a little closer and said again, \"Honey, can you hear me?\"\rStill, there was no response.\rFinally he moved right behind her and said, \"Honey, can you hear me?\"\rShe replied, \"For the third time, Yes!\"","Type":"TextMessage","MESSAGE_ID":"140","DISPLAY_POSITION":"singlePage","USER_NAME":null,"TITLE":"TEST - Hard Of Hearing","START_DATE":"2011-06-20","END_DATE":"2012-06-26","ACTIVE":true,"ResendMails":null,"EMAILS":null,"STRUCTURES":null},{"CONTENT":"An old man was wondering if his wife had a hearing problem.\rSo one night, he stood behind her while she was sitting in her lounge chair.\rHe spoke softly to her, \"Honey, can you hear me?\"\rThere was no response.\rHe moved a little closer and said again, \"Honey, can you hear me?\"\rStill, there was no response.\rFinally he moved right behind her and said, \"Honey, can you hear me?\"\rShe replied, \"For the third time, Yes!\"","Type":"TextMessage","MESSAGE_ID":"140","DISPLAY_POSITION":"singlePage","USER_NAME":null,"TITLE":"TEST - Hard Of Hearing","START_DATE":"2011-06-20","END_DATE":"2012-06-26","ACTIVE":true,"ResendMails":null,"EMAILS":null,"STRUCTURES":null},{"CONTENT":"test","Type":"TextMessage","MESSAGE_ID":"175","DISPLAY_POSITION":"singlePage","USER_NAME":null,"TITLE":"test","START_DATE":"2011-11-30","END_DATE":"2012-12-07","ACTIVE":true,"ResendMails":null,"EMAILS":null,"STRUCTURES":null},{"IMAGE_PATH":"http:\/\/www2.hs-augsburg.de\/infoterm-fki-test\/Content\/174_Tulips.jpg","Type":"ImageMessage","MESSAGE_ID":"174","DISPLAY_POSITION":"fullPage","USER_NAME":null,"TITLE":"bildtest v1","START_DATE":"2011-10-19","END_DATE":"2012-10-26","ACTIVE":true,"ResendMails":null,"EMAILS":null,"STRUCTURES":null}]

    => Webservice URL: www2.hs-augsburg.de/infoterm-f…1000,1001,1002,1003,25,31

    Kann mir jemand einen Tipp geben?

    Gruß

    schönen Sonntag
    lernen, lernen, lernen :)
  • Verstehe das Problem jetzt anscheinend nicht.

    Du schreibst, dass der TableView die Titel der Nachrichten anzeigen soll, also sicherlich den Inhalt zum Key "TITLE". Du verwendest für die TableViewCells jedoch den Inhalt zum Key "CONTENT", aber warum? ?(

    Wenn Du jetzt auf eine Zelle tippst, dann soll sich ein DetailView öffnen und die Nachricht detailiert anzeigen, also sicherlich den Inhalt zum Key "CONTENT".

    Doch wo ist da jetzt das Problem?

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

  • 8|
    Tut mir Leid falscher Code xD
    Jetza aber:

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. static NSString *CellIdentifier = @"structureCell";
    4. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    5. if (cell == nil) {
    6. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    7. }
    8. // Configure the cell...
    9. NSDictionary *cellValue = [jsonArray objectAtIndex:indexPath.row];
    10. cell.textLabel.text = [cellValue objectForKey:@"TITLE"];
    11. cell.textLabel.font = [UIFont systemFontOfSize:14.0];
    12. return cell;
    13. }
    Alles anzeigen


    Also für die Titel nehme ich wie du gesagt hast objectForKey:@"TITLE".
    Auf der Detailseite nehme natürlich oFK:@"CONTENT" das stimmt auch.
    Aber ich weiß nicht, wie ich es zuweisen soll. Angenommen er nimmt bei der Titelübersicht die Cell 3, wie
    sage ich auf der Folgeseite, dass er den Content zu Cell 3 / Titel 3 nehmen soll?
    lernen, lernen, lernen :)
  • Ich habe es erst so versucht: Ich habe die STRUCTURE_ID von dem TITEL der jeweiligen Celle in ein NSUSerDefault gespeichert. Auf der DetailView Seite lese ich es wieder aus und baue dynamisch die Parse URL für mein Content auf. Aber das funktioniert irgendwie auch nicht...
    lernen, lernen, lernen :)
  • Für den Lösungsweg:

    Erstelle eine (String)-Property in deinem DetailViewController. Diese heißt zb. contentString. Dann, im didSelectRowAtIndexPath:

    DetailViewController* controller = [allc/init usw];
    controller.contentString = [meinJSONArray objectAtIndex:indexPath.row];

    im DetailViewController:

    viewWillAppear:

    self.meinTextView.text = self.contentString;
    Gruß

    Robin
  • Ich habe jetzt das nsdictionary per property der DetailView bekannt gemacht.
    Entweder gibt er mir NULL aus, oder er gibt mir einen nicht passenden CONTENT zum TITLE.
    An was liegt das? property, synthesize sind gesetzt.

    Quellcode

    1. NewsViewController *newsTemp = [[NewsViewController alloc]initWithNibName:@"NewsViewController" bundle:nil];
    2. newsTemp.tempDic = [[NSDictionary alloc]init];
    3. // newsTemp.tempDic = [newsJson objectAtIndex:indexPath.row];
    4. customCell.textLabel.text =[newsTemp.tempDic objectForKey:@"CONTENT"];
    lernen, lernen, lernen :)
  • Mir ist bewusst, dass ich das neu erstellte dictionary mit dem Wert des Vorgängers initialisieren muss.
    Aber ich weiß noch nicht genau wie -.-

    Quellcode

    1. newsTemp.tempDic = [[NSDictionary alloc]initWithDictionary:<#(NSDictionary *)#>];


    In dem Platzhalter müsste ich jetzt "self.tempDic" einfügen. Aber er erkennt das nicht -.-
    lernen, lernen, lernen :)
  • Quellcode

    1. [newsTemp.tempDic initWithDictionary:self.tempDic];

    So habe ich es mal geschrieben. Wenn ich es richtig verstanden habe, dann initialisiere ich den neu erstellten tempDic mit dem Wert des Ur Dictionary aus dem VorController tempDic.
    ABER dann kommt das:

    "Property 'tempDic' not found on object of type 'DetailsViewController *'"

    Mir ist schon klar, dass die Property nicht vorhanden ist, weil es ja auch in dem VorController deklariert wurde.
    Hab ich nen Denkfehler?
    lernen, lernen, lernen :)
  • Sehr gerne.
    Anbei die 2 Controller.
    NewsViewController und DetailsViewController sind die betroffenen Contr.

    • NewsViewsController bezieht seine dynamische URL für den Webservice Parsevorgang von dem PrefViewController.
      In CellForRowAtIndexPath greife ich über jsonArray auf die Titel der Ergebnisse zurück und stelle sie in einem TableView dar.

    • Bei einem Click auf eine Zelle öffnet er DetailsViewController.
      in didSelectRowAtIndexPath versuche ich abhängig vom Titel den dazugehörigen Content anzuzeigen.


    Gruß
    lernen, lernen, lernen :)
  • Du solltest wirklich etwas zum Thema Objective-C, Speicherverwaltung und ARC lesen und verstehen.

    Warum hast Du z.B. jsonArray ausserhalb der Klasse NewsViewController definiert? Du solltest jsonArray innerhalb von NewsViewController mit entsprechender Property oder komplett per Property definieren.

    Die Klassenmethode JSONObjectWithData:options:error: liefert Dir ein autoreleased Objekt. Diesem Objekt musst Du, bei manueller Speicherverwaltung, ein retain senden oder bei Verwendung von ARC entsprechend referenzieren, damit das Objekt auch nach dem Event-Loop noch existiert. Schau Dir daher mal genau die Doku zu ARC an.