JSON解析UITableViewController

Posted

技术标签:

【中文标题】JSON解析UITableViewController【英文标题】:JSON parsing UITableViewController 【发布时间】:2014-03-31 07:25:21 【问题描述】:

我正在尝试将我的 JSON 数据传递到 UITableViewController。我确实设法将我的一个 JSON 传递到 UITableView 并在用户执行 egue 时将其显示在下一个 ViewController 上。问题是我有 4 个 JSON 数据,我希望它显示在 ViewController 上。由于我的 JSON 格式,我无法执行 ObjectForKey。

这是我的 JSON


    uid: "60",
    name: "pae1344",
    mail: "viper1344@gmail.com",
    theme: "",
    signature: "",
    signature_format: "plain_text",
    created: "1396189622",
    access: "0",
    login: "1396189622",
    status: "1",
    timezone: "Asia/Bangkok",
    language: "",
    picture: "0",
    init: "viper1344@gmail.com",
    data: null,
    uri: "http://localhost/drupal/rest/user/60"
,

这是来自 myTableViewController 的代码。

#import "TestinViewController.h"
#import "AFNetworking.h"
#import "TestinCell.h"
#import "EDscriptionViewController.h"
@interface TestinViewController ()

@end

@implementation TestinViewController

- (id)initWithStyle:(UITableViewStyle)style

    self = [super initWithStyle:style];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    self.finishedGooglePlacesArray = [[NSArray alloc] init];
    [self makeRestuarantsRequests];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.

-(void)makeRestuarantsRequests

    NSURL *url = [NSURL URLWithString:@"http://localhost/drupal/rest/enterpriselist.json"];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                         JSONRequestOperationWithRequest:request
                                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, id responseObject)
                                         

                                             self.googlePlacesArrayFromAFNetworking = [responseObject valueForKey:@"node_title"];
                                             self.body = [responseObject valueForKey:@"Body"];
                                             self.tel = [responseObject valueForKey:@"Enterprise Tel"];
                                             self.mail = [responseObject valueForKey:@"Enterprise email"];

                                              [self.tableView reloadData];
                                             NSLog(@"%@", self.googlePlacesArrayFromAFNetworking);
                                             NSLog(@"%@" , self.body);
                                             NSLog(@"%@", self.tel);
                                             NSLog(@"%@", self.mail);
                                         
                                         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id responseObject)
                                         
                                             NSLog(@"Request Failed with Error: %@, %@", error, error.userInfo);
                                         ];

    [operation start];


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

#warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;


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

#warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [self.googlePlacesArrayFromAFNetworking count];


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

    static NSString *CellIdentifier = @"Cell";
    TestinCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell ==Nil)
        cell = [[TestinCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    
    cell.txtEnterPriseName.text = [self.googlePlacesArrayFromAFNetworking objectAtIndex:indexPath.row];
    cell.txtEnterPriseBody.text = [self.body objectAtIndex:indexPath.row];
    cell.txtEnterPriseEmail.text = [self.mail objectAtIndex:indexPath.row];
    cell.txtEnterPriseTel.text = [self.tel objectAtIndex:indexPath.row];
    // Configure the cell...

    return cell;

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


        NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow];
        EDscriptionViewController *destViewController = (EDscriptionViewController*) segue.destinationViewController ;
        //     destViewController.enterprise = [enterPrise_names objectAtIndex:indexPath.row];
        destViewController.detail = [self.googlePlacesArrayFromAFNetworking objectAtIndex:indexPath.row];


    destViewController.Ebody = [self.body objectAtIndex:indexPath.row];
    destViewController.EEmail = [self.mail objectAtIndex:indexPath.row];
    destViewController.ETel = [self.tel objectAtIndex:indexPath.row];
    //    destViewController.ebody = [self.body objectAtIndex:indexPath.row];
//    destViewController.etel = [self.tel objectAtIndex:indexPath.row];
//    destViewController.email = [self.mail objectAtIndex:indexPath.row];
//    



有没有办法让我将我的 JSON 变成字典,所以我可以使用 ObjectForKey 选择要显示的内容?

【问题讨论】:

解析字典的最佳方法是创建一个 NSObject 类并从那里解析,然后生成对象。 【参考方案1】:

首先通过将 .m 和 .h 文件添加到您的项目来使用此库:

JSONKit

然后您可以将 JSON 字符串转换为字典。

//JSONString is a NSString variable with the JSON
NSDictionary *myJSONDic = [JSONString objectFromJSONString]
NSLog(@"User Id is : %@",[myJSONDic valueForKey:@"uid"]);

【讨论】:

如果您使用了我的解决方案,您能接受我的回答吗?谢谢【参考方案2】:

您可以将 JSON 响应直接存储到 NSDictionary。不仅仅是检查该词典的打印结果。您将能够通过键访问这些值。

这里是例子:

NSDictionary *myDic = // JSON response;
NSLog(@"User Id is : %@",[myDic valueForKey:@"uid"]);

希望这会对你有所帮助。

【讨论】:

sry 在将我的 JSON 响应从 NSArray 更改为 NSDictionary 后,我发现了另一个问题。在 CellForRowIndexPath 中,我应该如何实现它? cell.txtEnterPriseName.text = [self.googlePlacesArrayFromAFNetworking objectAtIndex:indexPath.row];谢谢。 你可以这样传递:cell.txtEnterPriseName.text = [yourDicName valueForKey@"name"]; 非常感谢您的所有帮助,但是......我又遇到了另一个问题T__T似乎通过这样传递它只会传递1个值,在这个例子中是名称到下一个 viewController(不在 UItableviewController 上)。我应该如何以这样的方式实现这一点,即我可以将 1 个 JSON 作为块/组传递,然后在用户执行 egue 后对 valueForKey 进行分类以与每个 UILabel.text 匹配?抱歉问了太多问题。 我现在开始工作了!不用担心非常感谢您的所有帮助,我非常感谢上帝保佑您。无论您身在何处,都可以度过美好的白天/夜晚。

以上是关于JSON解析UITableViewController的主要内容,如果未能解决你的问题,请参考以下文章

JSON在线解析,新版本JSON在线解析

Scala解析JSON

如何将这个json进行解析?

pg解析json

PHP解析JSON

json数据解析出错应该怎么办?