2013-06-25 5 views
0

Когда я преобразовать JSON в NSDictionary затем вызвать ObjectForKey: я получаю ошибку: -[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0xa9801d0Cant получить объекты из JSON NSDictonary

Мой код для преобразования:

NSError *error; 

NSData *responseData = [NSData dataWithContentsOfURL:dataURL]; 

NSDictionary *json = [NSJSONSerialization 
         JSONObjectWithData:responseData 

         options:kNilOptions 
         error:&error]; 

NSLog(@"%@",json); 
//The exeption is hilighted here: 
NSArray *objects = [[json objectForKey:@"data"] objectForKey:@"children"]; 

Это файл:

{ 
    data =   { 
     after = "<null>"; 
     before = "<null>"; 
     children =    (
          { 
       data =      { 
        "approved_by" = "<null>"; 
        author = Jonovono; 
        "author_flair_css_class" = "<null>"; 
        "author_flair_text" = "<null>"; 
        "banned_by" = "<null>"; 
        clicked = 0; 
        created = 1371955129; 
        "created_utc" = 1371926329; 
        distinguished = "<null>"; 
        domain = "self.redditdev"; 
        downs = 1; 
        edited = 0; 
        hidden = 0; 
        id = 1gv8g1; 
        "is_self" = 1; 
        likes = "<null>"; 
        "link_flair_css_class" = "<null>"; 
        "link_flair_text" = "<null>"; 
        media = "<null>"; 
        "media_embed" =       { 
        }; 
        name = "t3_1gv8g1"; 
        "num_comments" = 2; 
        "num_reports" = "<null>"; 
        "over_18" = 0; 
        permalink = "/r/redditdev/comments/1gv8g1/rate_limiting_on_commenting/"; 
        saved = 0; 
        score = 4; 
        selftext = "Can't really find anyone else having this issue. I am using this ruby library for reddit api wrapper: https://github.com/paradox460/snoo\n\nIt seems when I comment only the first one goes through, and any others fail. It does not seem to return a message, but I am guessing it's because of the message that only comment so much in so much time. How can I get around that? Or is something else causing it? Thanks."; 
        "selftext_html" = "&lt;!-- SC_OFF --&gt;&lt;div class=\"md\"&gt;&lt;p&gt;Can&amp;#39;t really find anyone else having this issue. I am using this ruby library for reddit api wrapper: &lt;a href=\"https://github.com/paradox460/snoo\"&gt;https://github.com/paradox460/snoo&lt;/a&gt;&lt;/p&gt;\n\n&lt;p&gt;It seems when I comment only the first one goes through, and any others fail. It does not seem to return a message, but I am guessing it&amp;#39;s because of the message that only comment so much in so much time. How can I get around that? Or is something else causing it? Thanks.&lt;/p&gt;\n&lt;/div&gt;&lt;!-- SC_ON --&gt;"; 
        subreddit = redditdev; 
        "subreddit_id" = "t5_2qizd"; 
        thumbnail = ""; 
        title = "Rate limiting on commenting?"; 
        ups = 5; 
        url = "http://www.reddit.com/r/redditdev/comments/1gv8g1/rate_limiting_on_commenting/"; 
       }; 
       kind = t3; 
      } 
     ); 
     modhash = 6dviotq5igca155758e9e858f1d863870f1b5296d9d571d45d; 
    }; 
    kind = Listing; 
}, 
    { 
    data =   { 
     after = "<null>"; 
     before = "<null>"; 
     children =    (
          { 
       data =      { 
        "approved_by" = "<null>"; 
        author = pipeep; 
        "author_flair_css_class" = "<null>"; 
        "author_flair_text" = "<null>"; 
        "banned_by" = "<null>"; 
        body = "New accounts are severely rate limited on comment speed to prevent spamming. Once you accumulate some karma, that goes down rather quickly. I've found that my bot with a few thousand karma is able to post a few times a minute at peek without any problems.\n\nThe API returns an error if you post too quickly (Probably `RATELIMIT` or `SUBREDDIT_RATELIMIT`; I don't remember). You can either drop those comments or put them in a queue and retry later, hoping that your queue doesn't get too long."; 
        "body_html" = "&lt;div class=\"md\"&gt;&lt;p&gt;New accounts are severely rate limited on comment speed to prevent spamming. Once you accumulate some karma, that goes down rather quickly. I&amp;#39;ve found that my bot with a few thousand karma is able to post a few times a minute at peek without any problems.&lt;/p&gt;\n\n&lt;p&gt;The API returns an error if you post too quickly (Probably &lt;code&gt;RATELIMIT&lt;/code&gt; or &lt;code&gt;SUBREDDIT_RATELIMIT&lt;/code&gt;; I don&amp;#39;t remember). You can either drop those comments or put them in a queue and retry later, hoping that your queue doesn&amp;#39;t get too long.&lt;/p&gt;\n&lt;/div&gt;"; 
        created = 1371970411; 
        "created_utc" = 1371941611; 
        distinguished = "<null>"; 
        downs = 0; 
        edited = 0; 
        gilded = 0; 
        id = cao9eaf; 
        likes = "<null>"; 
        "link_id" = "t3_1gv8g1"; 
        name = "t1_cao9eaf"; 
        "num_reports" = "<null>"; 
        "parent_id" = "t3_1gv8g1"; 
        replies =       { 
         data =        { 
          after = "<null>"; 
          before = "<null>"; 
          children =         (
                    { 
            data =           { 
             "approved_by" = "<null>"; 
             author = Jonovono; 
             "author_flair_css_class" = "<null>"; 
             "author_flair_text" = "<null>"; 
             "banned_by" = "<null>"; 
             body = "Alright, thanks. Good to know it goes down with karma. So karma is good for something."; 
             "body_html" = "&lt;div class=\"md\"&gt;&lt;p&gt;Alright, thanks. Good to know it goes down with karma. So karma is good for something.&lt;/p&gt;\n&lt;/div&gt;"; 
             created = 1372014449; 
             "created_utc" = 1371985649; 
             distinguished = "<null>"; 
             downs = 0; 
             edited = 0; 
             gilded = 0; 
             id = caoivdj; 
             likes = "<null>"; 
             "link_id" = "t3_1gv8g1"; 
             name = "t1_caoivdj"; 
             "num_reports" = "<null>"; 
             "parent_id" = "t1_cao9eaf"; 
             replies = ""; 
             "score_hidden" = 0; 
             subreddit = redditdev; 
             "subreddit_id" = "t5_2qizd"; 
             ups = 1; 
            }; 
            kind = t1; 
           } 
          ); 
          modhash = 6dviotq5igca155758e9e858f1d863870f1b5296d9d571d45d; 
         }; 
         kind = Listing; 
        }; 
        "score_hidden" = 0; 
        subreddit = redditdev; 
        "subreddit_id" = "t5_2qizd"; 
        ups = 1; 
       }; 
       kind = t1; 
      } 
     ); 
     modhash = 6dviotq5igca155758e9e858f1d863870f1b5296d9d571d45d; 
    }; 
    kind = Listing; 
} 
) 

Мне нужно получить любой объект из JSON, но я не знаю, почему это исключение выбрасывается.

+0

Нет такой вещи, как «JSON NSDictionary». У вас может быть NSDictionary, построенный из ввода JSON, но как только словарь будет построен, он мог бы прийти откуда угодно.(Но, кстати, ваша проблема в том, что у вас нет NSDictionary, а скорее NSArray, что можно легко увидеть из дампа NSLog - скобки '()' окружают NSArray.) –

+0

Здесь я указал, как я проанализировать json-файл в словаре [http://lineofcodes.blogspot.in/2013/02/json-file-parsing-in-ios.html](http://lineofcodes.blogspot.in/2013/02/json- файл-синтаксический-в-ios.html). Это может вам помочь. –

+0

Эта страница более чем бесполезна. Вы не можете просто сказать: «Вот как вы разбираете (sic) JSON», не зная структуру конкретного JSON, который вы распутываете. –

ответ

3

Вы видите это одинокое ) прямо в конце вывода JSON, который вы предоставили. Если вы посмотрите на фактический журнал из Xcode, вы, вероятно, увидите, что есть соответствующий (, который вы забыли скопировать и вставить в свой вопрос.

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

Это должно помочь вам распаковать объект JSON, вам нужно выполнить итерацию по массиву словарей, извлекающих нужные вам значения.

+0

Какой выход JSON? Это дамп объектов NSDictionary и NSArray. JSON не использует '()'. –

+0

@Abizem Но я не могу найти конкретные объекты, используя 'ObjectForKey:' с массивом. Как я могу использовать NSArray для поиска моих объектов? – user2480176

+0

@hotlicks Это по-прежнему указывает, что его JSON - это массив, а не словарь. – Abizern

0

JSON - это массив, не словарь. Получите первый элемент из массива, прежде чем вы получите доступ к нему в качестве словаря.

0

Ваш объект json является NSArray, который вы пытаетесь получить доступ, как NSDictionary (objectForKey:)

1

Я завершит @Abizem ответ, добавив небольшой фрагмент кода, потому что я вижу, что вы начинающий (I не имеют с этим никаких проблем), и я знаю, что когда вы начинаете программировать или новый язык, фрагменты кода действительно полезны (не учитывает, что в Google полно инструкций по разбору JSON, и SO полна сообщений, которые имеют ваши проблема unrecognized selector при разборе.)

Итак, всякий раз, когда у вас есть JSON, который начинается с (, это означает, что JSON является массивом, если JSON начинается с {, тогда JSON является словарем.

Чтобы получить объекты из массива JSON, вам придется перебирать его. Объектами, содержащимися в JSON, могут быть словари или массивы.

Так что если у вас есть только словари в ваш массив следует использовать:

for(NSDictionary *contentDictionary in yourJSONObject) { 
    //do stuffs with your dictionary 
} 

Если у вас есть только массивы в ваш JSON вы должны использовать:

for(NSArray *contentArray in yourJSONObject) { 
//do stuffs with your dictionary 
} 

Если у вас есть как массивы и словари в вашем JSON вы должны использовать:

for(id unknownType in yourJSONObject) { 
    if([unknownType isKindOfClass:[NSDictionary class]]) { 
     NSDictionary *dict = (NSDictionary*)unknownType; 
    } 
    else if ([unknownType isKindOfClass:[NSArray class]]{ 
     NSArray *array = (NSArray *)unknownType; 
    } 
} 

Если ваш JSON - это словарь, вы можете используйте методы NSDictionary для получения правильных значений:

[dictJSON objectForKey:@"myKey"]; 
+0

Это на самом деле то, что я поставил после того, как узнал больше о JSON. Я больше начинаю JSON, затем iOS, поэтому спасибо за внимание. – user2480176