JSON Struktur ermitteln

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

  • JSON Struktur ermitteln

    Hallo,

    das leidige Thema. Irgendwie habe ich es bis jetzt noch immer auseinander gefuddelt bekommen, aber jetzt sitze ich hier schon was länger und habe mir gedacht ich lass mir mal helfen. Es geht darum, dass ich es immer etwas schwierig finde in einem JSON zu erkennen, was ist ein Dictionary, was ist ein Array, wie komme ich an die gewünschte Information. Ich habe hier ein JSON von Foursquare (Beispiel) :

    Quellcode

    1. ​{
    2. "meta" : {
    3. "code" : 200
    4. },
    5. "response" : {
    6. "neighborhoods" : [
    7. ],
    8. "confident" : false,
    9. "venues" : [
    10. {
    11. "location" : {
    12. "address" : "BAB 3",
    13. "city" : "Limburg an der Lahn",
    14. "distance" : 718,
    15. "country" : "Deutschland",
    16. "lat" : 50.38891418550349,
    17. "lng" : 8.079118248496385,
    18. "cc" : "DE"
    19. },
    20. "specials" : {
    21. "count" : 0,
    22. "items" : [
    23. ]
    24. },
    25. "id" : "4d6bcc1371d3721ef1ff9506",
    26. "contact" : {
    27. },
    28. "categories" : [
    29. {
    30. "id" : "4bf58dd8d48988d1df941735",
    31. "pluralName" : "Brücken",
    32. "icon" : {
    33. "prefix" : "https:\/\/ss1.4sqi.net\/img\/categories_v2\/parks_outdoors\/bridge_",
    34. "suffix" : ".png"
    35. },
    36. "name" : "Brücke",
    37. "shortName" : "Brücke",
    38. "primary" : true
    39. }
    40. ],
    41. "verified" : false,
    42. "stats" : {
    43. "tipCount" : 1,
    44. "checkinsCount" : 312,
    45. "usersCount" : 128
    46. },
    47. "hereNow" : {
    48. "count" : 0,
    49. "summary" : "0 Leute hier",
    50. "groups" : [
    51. ]
    52. },
    53. "referralId" : "v-1398089720",
    54. "name" : "Lahntalbrücke"
    55. },
    56. {
    57. "location" : {
    58. "address" : "Domplatz 3",
    59. "city" : "Limburg an der Lahn",
    60. "distance" : 686,
    61. "postalCode" : "65549",
    62. "country" : "Deutschland",
    63. "lat" : 50.38875961988756,
    64. "lng" : 8.066523671150208,
    65. "cc" : "DE"
    66. },
    67. "specials" : {
    68. "count" : 0,
    69. "items" : [
    70. ]
    71. },
    72. "id" : "4b806079f964a520bb6c30e3",
    73. "contact" : {
    74. },
    75. "categories" : [
    76. {
    77. "id" : "4bf58dd8d48988d132941735",
    78. "pluralName" : "Kirchen",
    79. "icon" : {
    80. "prefix" : "https:\/\/ss1.4sqi.net\/img\/categories_v2\/building\/religious_church_",
    81. "suffix" : ".png"
    82. },
    83. "name" : "Kirche",
    84. "shortName" : "Kirche",
    85. "primary" : true
    86. }
    87. ],
    88. "verified" : false,
    89. "stats" : {
    90. "tipCount" : 3,
    91. "checkinsCount" : 478,
    92. "usersCount" : 294
    93. },
    94. "hereNow" : {
    95. "count" : 1,
    96. "summary" : "1 Person hier",
    97. "groups" : [
    98. {
    99. "count" : 1,
    100. "type" : "others",
    101. "name" : "Andere Leute hier",
    102. "items" : [
    103. ]
    104. }
    105. ]
    106. },
    107. "referralId" : "v-1398089720",
    108. "name" : "Dom St. Georg"
    109. }
    110. ]
    111. }
    112. }
    Alles anzeigen



    Ich möchte nun gerne an "name" (also nicht den category name, sondern nur "name") und lat, lng kommen.
    Daher dachte ich ins Dictionary "response", dann ins array venues, dort ins dictionary "location" dort dann lat und lng holen. Für name würde ich den Weg "response" Dictionary, dann venues array dann "name" gehen. Irgendwie bekomme ich aber jedesmal ein

    Quellcode

    1. ​[__NSCFString objectForKey:]: unrecognized selector sent to instance
    zurück. Habe ich irgendwas in der JSON Struktur übersehen ?

    Vielen Dank !

    Mein Code bis jetzt, um den Namen zu extrahieren :

    Quellcode

    1. jsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&errorJson];
    2. ...
    3. if (errorJson != nil)
    4. {
    5. NSLog(@"Error %@", [errorJson localizedDescription]);
    6. }
    7. else
    8. {
    9. for (NSMutableDictionary *dict in jsonArray)
    10. {
    11. if ([dict objectForKey:@"response"] != [NSNull null])
    12. {
    13. NSMutableDictionary *responseDict = [dict objectForKey:@"response"];
    14. NSMutableArray *venues = [responseDict objectForKey:@"venues"];
    15. for(NSMutableDictionary *dict in venues) {
    16. NSLog(@"%@", [dict objectForKey:@"name"]);
    17. }
    18. //[returnArray addObject:obj];
    19. }
    20. }
    21. }
    Alles anzeigen
  • Ich habe mir für sowas mal was geschrieben, das ich recht praktisch finde.

    Die Methode getElements liefert Dir immer ein Array mit allen Elementen von elementName die tiefer sind als parentElements. Dabei ist es egal ob das Dictionaries oder Arrays sind. Wenn Dein Struktur also relativ fix ist, kannst Du damit sehr einfach alles aus deinem JSON holen das du brauchst.

    Quellcode

    1. +(NSArray*)getElements:(NSString*)elementName fromParent:(id)parentElements
    2. {
    3. NSMutableArray *parents=parentElements;
    4. if(!parents)
    5. return nil;
    6. if(![parents isKindOfClass:[NSMutableArray class]] && ![parents isKindOfClass:[NSArray class]])
    7. parents=[NSMutableArray arrayWithObject:parentElements];
    8. NSMutableArray *results=[NSMutableArray array];
    9. for(id element in parents)
    10. {
    11. [results addObjectsFromArray:[self addElements:elementName fromParentElement:element]];
    12. }
    13. return results;
    14. }
    15. +(NSArray*)addElements:(NSString *)elementName fromParentElement:(id)elements
    16. {
    17. NSMutableArray *results=[NSMutableArray array];
    18. // Wenn das Element ein Array ist, dann druchiterieren
    19. if([elements isKindOfClass:[NSArray class]] || [elements isKindOfClass:[NSMutableArray class]])
    20. {
    21. for(id element in (NSArray*) elements)
    22. {
    23. [results addObjectsFromArray:[self addElements:elementName fromParentElement:element]];
    24. }
    25. }
    26. else
    27. {
    28. // Wenn es ein Dictionary ist, dann alle Keys absuchen
    29. if([elements isKindOfClass:[NSDictionary class]] || [elements isKindOfClass:[NSMutableDictionary class]])
    30. {
    31. for(id key in (NSDictionary*)elements)
    32. {
    33. if([key isEqualToString:elementName])
    34. {
    35. id object=[elements objectForKey:key];
    36. if([object isKindOfClass:[NSArray class]])
    37. [results addObjectsFromArray:[elements objectForKey:key]];
    38. else
    39. [results addObject:[elements objectForKey:key]];
    40. }
    41. [results addObjectsFromArray:[self addElements:elementName fromParentElement:[elements objectForKey:key]]];
    42. }
    43. }
    44. }
    45. return results;
    46. }
    Alles anzeigen


    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Danke euch, sehr nützliche Antworten ! Habe es nun also hinbekommen. Ich hatte es ja im Prinzip schon fast, nur dass ich fälschlicherweise dachte

    Quellcode

    1. ​[NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&errorJson];
    würde mir in diesem Fall ein NSMutableArray liefern, es aber ein NSMutableDictionary war. Der weg weiter zu den einzelnen Keys stimmte dann...



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