2

reddit.comからのJSONフィードを解析して、テーブルビューに表示しようとしています。JSONは次のようになります。

{
kind: Listing
data: {
modhash: 3lmt2d4hq6797af804da91bde566bd067ddee68e1e7f8e0dda
children: [
{
kind: t3
data: {
domain: imgur.com
banned_by: null
media_embed: { }
subreddit: funny
selftext_html: null
selftext: 
likes: null
link_flair_text: null
id: 16e9so
clicked: false
title: I left my dog unattended with the 2 year old...
num_comments: 166
score: 2213
approved_by: null
over_18: false
hidden: false
thumbnail: http://c.thumbs.redditmedia.com/DaoiOlvtdjaPBG3n.jpg
subreddit_id: t5_2qh33
edited: false
link_flair_css_class: null
author_flair_css_class: null
downs: 2481
saved: false
is_self: false
permalink: /r/funny/comments/16e9so/i_left_my_dog_unattended_with_the_2_year_old/
name: t3_16e9so
created: 1357963292
url: http://imgur.com/zGMxP
author_flair_text: null
author: ShaneNickerson
created_utc: 1357934492
media: null
num_reports: null
ups: 4694
}
...more items here
}

そして、これが私のテーブルビューコントローラーコードです:

    #import "mainRedditFunViewController.h"
    #define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    #define kjsonURL [NSURL URLWithString: @"http://reddit.com/r/funny/.json"
@interface mainRedditFunViewController ()

@end

@implementation mainRedditFunViewController

- (void)viewDidLoad

{

    [super viewDidLoad];

    dispatch_async(kBgQueue, ^{

        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://reddit.com/r/funny/.json"]];

        [self performSelectorOnMainThread:@selector(fetchedData:)
                               withObject:data waitUntilDone:YES];

    });

}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

    // Return the number of sections.

    return 1;

}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    NSDictionary *appsdict = [jsonResults objectAtIndex:indexPath.row];

    NSString *VersionString = [appsdict objectForKey:@"url"];

    NSString *priceString = [appsdict objectForKey:@"author"];

    NSURL *imageURL = [NSURL URLWithString:[appsdict objectForKey:@"thumbnail"]];

    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

    UIImage *imageLoad = [[UIImage alloc] initWithData:imageData];

    cell.textLabel.text = [appsdict objectForKey:@"title"];

    cell.detailTextLabel.text = [NSString stringWithFormat:@"URL: %@ Author: $ %@ USD",VersionString,priceString];

    cell.imageView.image = imageLoad;

    return cell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

    // Return the number of rows in the section.

    return [jsonResults count];

}


- (void)fetchedData:(NSData *)responseData {

    NSError* error;

    NSDictionary* json = [NSJSONSerialization

                          JSONObjectWithData:responseData

                          options:kNilOptions

                          error:&error];

    jsonResults = [json objectForKey:@"data.children"];

    [self.tableView reloadData];

}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

ただし、出力は完全に空です。とにかく私はそれを修正することができますか?以前に別の(小さい)フィードで試しましたが、うまくいきました。私は次のように見えるので、JSONPathフォーマットを正しく行っているかどうかを確認します。

-kind
 ->data
  ->children
    ->data (my items)
    ->data
    ->data
    ...

助けていただければ幸いです。

4

1 に答える 1

1

この回答が遅れてすみません!それがまだ必要であることを願っています...

返されたJson結果のサブレベルにアクセスするために、コードを少し変更しました。

あなたは確かに正しいアイデアを持っていますが、fetchedDataメソッドにさらにいくつかの辞書が必要です。これらの辞書をNSJSONSerializationの下のメソッドに追加すると、

 NSDictionary* json = [NSJSONSerialization

                      JSONObjectWithData:data

                      options:kNilOptions

                      error:&error];

//NSArray *Fullarray = [[NSArray alloc] initWithObjects:json, nil];

_jsonResult = [[NSMutableArray alloc] init];

NSDictionary *dataDict = [json objectForKey:@"data"];
NSDictionary *chilrenDict = [dataDict objectForKey:@"children"];

for (NSDictionary *informationFromChild in chilrenDict) {
    NSLog(@"chil %@", chilrenDict);
    [_jsonResult addObject:chilrenDict];
}

次に、tableViewcellForRowでappsDictをこれに変更します

NSDictionary *appsdict = [[_jsonResult objectAtIndex:indexPath.row] objectForKey:@"data"];

これでコードが修正され、tableViewにデータが入力されます...これについてもチェックを実行できます。

NSLog(@"count %i", [_jsonResult count]);

テーブルビューに入力されたデータ

これが役に立ったかどうか教えてください、幸せなコーディング。T

于 2013-03-03T10:52:55.347 に答える