【问题标题】:How do I fetch data from URL, using xcode 4.3.1 with NSJSONSerialization Class Reference如何使用带有 NSJSONSerialization 类参考的 xcode 4.3.1 从 URL 获取数据
【发布时间】:2012-03-17 19:59:57
【问题描述】:

我正试图了解NSJSONSerialization Class Reference。在 developer.apple.com 网站上缺少代码示例,我迷路了。 网络上有数以百万计的示例以及其他 json 库,但我无法让它们中的任何一个与最新版本的 xcode 一起工作。 (我正在运行:版本 4.3.1 (4E1019) 并在 iPhone 5.0.1 上进行测试)

我想使用一个按钮将 json 文件中的数据提取到我的 iphone 中。

假设我从 URL 获取数据: http://companyurl/jsonfile.json(标准 JSON 格式)

jsonfile.json 看起来像这样……;

{
  "companylist":   
[
      {
        "company":"Companyname 1",
        "telephone":"1234567890",
        "url":"http:\/\/www.companyname1.com\/",
        "category":"category 1",
        "position":"1",
      },
      {
        "company":"Companyname 2",
        "telephone":"2345678901",
        "url":"http:\/\/www.companyname2.com\/",
        "category":"category 2",
        "position":"2",
      },
      {
        "company":"Companyname 3",
        "telephone":"3456789012",
        "url":"http:\/\/www.companyname3.com\/",
        "category":"category 3",
        "position":"3",
      }
]
}

我在 .h 和 .m 文件中写什么?

感谢您的帮助! :)

【问题讨论】:

标签: iphone ios json xcode4.3 nsjsonserialization


【解决方案1】:
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://your_web_server/your_file...."]];
NSError *error=nil;
id response=[NSJSONSerialization JSONObjectWithData:data options:
                                NSJSONReadingMutableContainers error:&error]; 

NSLog(@"Your JSON Object: %@ Or Error is: %@", response, error);

注意:此代码目前适用于 Xcode 4.2,模拟器上的 iOS 5.01 和 iPad 设备上的 5.1

【讨论】:

    【解决方案2】:

    谢谢各位。我想到了。 (...这就是我所做的:)

    在我的 .m 文件中,我添加了以下代码:

        - (IBAction)getDataFromJson:(id)sender {
            NSURL *url = [NSURL URLWithString:@"http://yourwebsite.com/jsonfile.json"];
    
            NSData *jsonData = [NSData dataWithContentsOfURL:url];
    
    
            if(jsonData != nil)
            {
                NSError *error = nil;
                id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
                if (error == nil)
                    NSLog(@"%@", result);
    }
    }
    

    在我的 .h 文件中,我添加了以下代码:

    @interface ViewController : UIViewController
    - (IBAction)getDataFromJson:(id)sender;
    

    【讨论】:

      【解决方案3】:

      【讨论】:

      • (我没有让这个工作......但我可能错过了一些东西。)
      【解决方案4】:

      永远不要使用 dataWithContentsOfURL: 以这种方式获取服务器数据。它是不可控的,可能会使您的应用程序处于未知状态。您至少应该使用 NSURLRequest 进行所有 url 调用。更好的是,如果您不支持 iOS7 之前的版本,请使用 NSURLSession。

      【讨论】:

        【解决方案5】:

        一个Tweeting sample app形式的代码示例。

        【讨论】:

          【解决方案6】:
              jsonDict = [[NSDictionary alloc] init];
              data = [[NSArray alloc] init]; 
          
                url =[NSURLURLWithString:@"Please Type Your URL  "];
          
          
           // Parse the JSON data from the given URL
            - (void) parseJSONWithURL:(NSURL *) jsonURL
            {
          // Set the queue to the background queue. We will run this on the background thread to keep
          // the UI Responsive.
              dispatch_queue_t queue =    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
          
            [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
          
          // Run request on background queue (thread).
                dispatch_async(queue, ^{
                NSError *error = nil;
          
              // Request the data and store in a string.
                NSString *json = [NSString stringWithContentsOfURL:jsonURL
                                                        encoding:NSASCIIStringEncoding
                                                           error:&error];
                if (error == nil){
          
                  // Convert the String into an NSData object.
                  NSData *jsonData = [json dataUsingEncoding:NSASCIIStringEncoding];
          
                  // Parse that data object using NSJSONSerialization without options.
                  jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
          
                  // Parsing success.
                  if (error == nil)
                  {
                      // Go back to the main thread and update the table with the json data.
                      // Keeps the user interface responsive.
                      dispatch_async(dispatch_get_main_queue(), ^{
                          [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
                          data= [[jsonDict valueForKey:@"Result"] valueForKey:@"data"];
                          [jsonTable reloadData];
                      });
                  }
          
                  // Parsing failed, display error as alert.
                  else
                  {
                      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Uh Oh, Parsing Failed." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
          
                      [alertView show];
                  }
              }
          
              // Request Failed, display error as alert.
              else
              {
                  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error!" message:@"Request Error! Check that you are connected to wifi or 3G/4G with internet access." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
          
                  [alertView show];
                }
             });
            }
          
          
           // Delegate call back for cell at index path.
            - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
             {
             UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
          
              if (cell == nil)
              {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
          }
          
          // Set the main label as the episode name.
             cell.textLabel.text = [[data objectAtIndex:indexPath.row] objectForKey:@"fullname"];
          
          
          
          
              NSNumber *seasonNum = [[data objectAtIndex:indexPath.row] objectForKey:@"username"];
              NSNumber *episodeNum = [[data objectAtIndex:indexPath.row] objectForKey:@"location"];
              NSMutableString *seasonEpisodeNum = [NSMutableString stringWithFormat:@"username: %@ ", seasonNum];
              [seasonEpisodeNum appendString:[NSMutableString stringWithFormat:@"location: %@", episodeNum]];
              cell.detailTextLabel.text = seasonEpisodeNum;
          
              return cell;
              }
          
          
          
          
          
          
            -(int) numberOfSectionsInTableView:(UITableView *) tableView
            {
             return 1;
            }
          
          
            - (int) tableView:(UITableView *) tableView numberOfRowsInSection:  (NSInteger)section
            {
          return [data count];
           }
          

          此代码实现 .m 文件

          和.h文件

              {
                 NSDictionary *jsonDict;
                 IBOutlet UITableView *jsonTable;
                 NSArray *data;
                 NSURL *url;
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-02
            • 1970-01-01
            • 2021-07-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多