2014-08-30 3 views
-1

У меня есть JSON-файл, который выглядит, как это в моем проекте:Как извлечь отдельные элементы из JSON

{ 
"city": [ 
     { 
     "NewYork": [ 
          { 
          "url_id": "63", 
          "title": "someTitle" 
          }, 
          { 
          "url_id": "62", 
          "title": "someOtherTitle" 
          } 
          ], 
     "Boston": [ 
          { 
          "url": "68", 
          "title": "someTitle" 
          } 
          ] 
    . 
    . 
    . 

Тогда я пытаюсь пройти через это в Objective-C и создать массив только названия городов. Я могу зарегистрировать весь JSON или свойства «Нью-Йорка», но не только имена.

Является ли мой JSON неправильным или я делаю что-то неправильно в коде?

Редактировать: Я забыл упомянуть, что некоторые города могут иметь несколько идентификаторов и названий, поэтому я считаю, что создание словарей не может быть и речи? Также у меня есть данные в файле, поэтому я не создаю его в коде.

+0

Возможный дубликат [Как повторить JSON-объект в ios] (http://stackoverflow.com/questions/16996624/how-to-iterate-json-object-in-ios) – memmons

+0

Я просмотрел этот ответ и многие другие. Проблема здесь в том, что JSON сделан мной, поэтому я не уверен, правильно ли он отформатирован, или я делаю что-то еще неправильно. – Pahnev

+0

* Я - файл JSON * либо вы являетесь файлом JSON, либо в вашем предложении отсутствует глагол. – vikingosegundo

ответ

0

Этот JSON выглядит не совсем правильно. Значение cities должно быть просто словарь:

{ 
    "cities" : { 
    "Boston" : [ 
     { 
     "url_id" : "63", 
     "title" : "someTitle" 
     }, 
     { 
     "url_id" : "62", 
     "title" : "someOtherTitle" 
     } 
    ], 
    "New York" : [ 
     { 
     "url_id" : "63", 
     "title" : "someTitle" 
     }, 
     { 
     "url_id" : "62", 
     "title" : "someOtherTitle" 
     } 
    ] 
    } 
} 

Если вы хотите, чтобы получить массив названий городов из приведенного выше JSON, вы бы преобразовать это в словарь и использовать allKeys возвращаемого значения из ключа cities :

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
NSArray *cityNames = [dictionary[@"cities"] allKeys]; 

Лично я считаю, что было бы лучше, чтобы сделать ваше cities значения в JSON массив из словарей, где название города является атрибутом словаря:

{ 
    "cities" : [ 
    { 
     "name" : "New York", 
     "urls" : [ 
     { 
      "url_id" : "63", 
      "title" : "someTitle" 
     }, 
     { 
      "url_id" : "62", 
      "title" : "someOtherTitle" 
     } 
     ] 
    }, 
    { 
     "name" : "Boston", 
     "urls" : [ 
     { 
      "url_id" : "63", 
      "title" : "someTitle" 
     }, 
     { 
      "url_id" : "62", 
      "title" : "someOtherTitle" 
     } 
     ] 
    } 
    ] 
} 

В этом случае, вы бы получить название городов, как так:

NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
NSArray *cityNames = [dictionary[@"cities"] valueForKey:@"name"]; 

Но JSON, предложенный в вопросе, кажется, есть некоторые избыточные [, ИМХО. И я думаю, что ключевое имя city вводит в заблуждение, поскольку оно содержит ряд городов, поэтому я бы предложил cities.

+0

Спасибо, что это сработало! Думаю, я должен был проверить синтаксис JSON немного больше. Я только что удалил первые [] скобки и код начал работать. – Pahnev

0

Необходимо сначала создать словарь, содержащий ключ города, а ключ города должен быть присвоен массиву.

NSDictionary *newYorkDict = { 
           @"url_id":@"63", 
           @"title":@"someTitle" 
           }; 

    NSDictionary *bostonDict = {@"url_id":@"63", 
           @"title":@"someTitle" 
           }; 

    NSArray *newYorkArray = [newYorkDict]; 
    NSArray *bostonArray = [bostonDict]; 

    NSDictionary *dict = { 
         @"New york":newYorkArray, 
         @"Boston":bostonArray 
         }; 

    NSArray *cityArray = [dict]; 

    NSDictionary *mainDict = {@"city":cityArray}; 
+0

Я думал сделать это прямо со словарями и массивами, но решил попробовать с JSON, потому что в некоторых городах было бы несколько названий и идентификаторов. – Pahnev

Смежные вопросы