0

我正在尝试解析包含图像 URL 的 JSON 文件。我的代码:

NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://my-site/pictureparse.php?name=Name"]];
    NSData *data= [NSData dataWithContentsOfURL:URL];
    if (data == nil) {
        return;
    }
    NSError* error;
    NSMutableDictionary *jsonIs = [NSJSONSerialization
                                   JSONObjectWithData:data
                                   options:kNilOptions
                                   error:&error];

    NSLog(@"Json : %@",jsonIs);
    if (jsonIs != nil) {

        NSString *item_media = [jsonIs objectForKey:@"link"];

其中“link”是指向 JSON 文件中图像的链接。JSON 结构如下所示:

[
    {
        "link": "http://link-to-image.com/picture.jpg",
        "title": "Title",
        "published": "0:01 PM 24/10"
    },
    {
        "link": "http://link-to-image.com/picture.jpg",
        "title": "Title",
        "published": "0:01 PM 24/10"
    },
    {
        "link": "http://link-to-image.com/picture.jpg",
        "title": "Title",
        "published": "0:01 PM 24/10"
    },
    {
        "link": "http://link-to-image.com/picture.jpg",
        "title": "Title",
        "published": "0:08 PM 23/10"
    }
]

当我启动应用程序时,我在 NSLog 中看到它解析对象,但出现错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x16e81ed0

如何获取这些已解析的对象/链接并将它们显示在诸如 Instagram 之类的提要中?

我已尝试使用以下代码,但它不起作用...

#import "PicturesViewController.h"
#import "DemoViewController.h"
#import "SecondViewController.h"
#import "AppDelegate.h"
#import "RNBlurModalView.h"
#import "PictureJSON.h"
#import "HMSegmentedControl.h"

@interface PicturesViewController ()
{
    NSInteger refreshIndex;
    NSArray *images;
}

@end

@implementation PicturesViewController

- (void)viewDidLoad
{

    HMSegmentedControl *segmentedControl = [[HMSegmentedControl alloc] initWithSectionTitles:@[@"Instagram", @"Hashtags", @"Facebook"]];
    [segmentedControl setFrame:CGRectMake(10, 10, 300, 60)];
    [segmentedControl addTarget:self action:@selector(segmentedControlChangedValue:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:segmentedControl];

    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Menu" style:UIBarButtonItemStyleBordered target:self action:@selector(showMenu)];

    UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(swipeHandler:)];
    [self.view addGestureRecognizer:gestureRecognizer];

    [self issueLoadRequest];
}

- (void)swipeHandler:(UIPanGestureRecognizer *)sender
{
    [[self sideMenu] showFromPanGesture:sender];
}

- (void)segmentedControlChangedValue:(HMSegmentedControl *)segmentedControl1 {
    [self issueLoadRequest];
}

- (void)segmentedControlSelectedIndexChanged:(id)sender
{
    [self issueLoadRequest];
}

#pragma mark -
#pragma mark Button actions

- (void)showMenu
{
    [[self sideMenu] show];
}

#pragma mark - Table view data source

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"PictureJSON";

    PictureJSON *cell = (PictureJSON *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"PictureJSON" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

    // The element in the array is going to be a dictionary. I JUST KNOW THIS. The key for the tweet is "text".
    NSDictionary *tweet = [self.tweets objectAtIndex:indexPath.row];
    NSLog(@"%@", [cell class]);

    UIImageView *instaImage = [[UIImageView alloc] init];
    instaImage.image = [tweet objectForKey:@"link"];

    cell.titleLabel.text = [tweet objectForKey:@"title"];
    cell.timeLabel.text = [tweet objectForKey:@"published"];

    return cell;
}


- (void)issueLoadRequest
{
    // Dispatch this block asynchronosly. The block gets JSON data from the specified URL and performs the proper selector when done.
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://my-site.com/picutreparse.php?name=Name"]];
        [self performSelectorOnMainThread:@selector(receiveData:) withObject:data waitUntilDone:YES];
    });
}

- (void)receiveData:(NSData *)data {
    // When we have the data, we serialize it into native cocoa objects. (The outermost element from twitter is
    // going to be an array. I JUST KNOW THIS. Reload the tableview once we have the data.
    self.tweets = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    [self.myTableView reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.tweets.count;
}

@end

我真的很感激一个解决方案!

4

2 回答 2

3

问题是您从解析中获得的对象是 aNSArray而不是 a NSDictionary

将您的代码编辑为此:

@interface PicturesViewController ()
{
    // ...
    NSArray *items;
}

在您获取数据的地方:

items = [NSJSONSerialization JSONObjectWithData:data
                                        options:kNilOptions
                                          error:&error];

最后:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    NSDictionary *item = [items objectAtIndex:indexPath.row];

    NSString *item_media = [item objectForKey:@"link"];
    // ...
}
于 2013-10-24T13:08:50.170 回答
1

你做 NSMutableDictionary 有什么问题

NSMutableArray *jsonIs = [NSJSONSerialization
                                   JSONObjectWithData:data
                                   options:kNilOptions
                                   error:&error];

    NSLog(@"Json : %@",jsonIs);

if (jsonIs != nil) {
NSMutableDictionary* aDict = jsonIs[0];
        NSString *item_media = [aDict objectForKey:@"link"];
}

你的主要 JSON 是一个数组,因为在这个数组中你有字典“[...]”:“{..}”

编辑 tableView 问题:

使NSMutableArray *jsonIs全球

@implementation PicturesViewController{
NSMutableArray *jsonIs
}

然后在 tableview 委托中:

    NSString *item_media = [jsonIs[indexPath.row] objectForKey:@"link"];
于 2013-10-24T13:08:53.930 回答