1

だから私はiOS開発に非常に慣れていないので、サーバーに接続して情報を取得する最初のアプリを作成しています。私はいくつかの異なるチュートリアルに従い、さまざまな場所からいくつかのjsonを引き出すことができました。私が抱えている問題は、プルする必要がある情報にルート要素がないことです。アプリに情報を取得するには何を変更する必要がありますか?

以下は私が使用しているコードです:

   #import "leagueTableViewController.h"

   #define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    #define kjsonURL [NSURL URLWithString: @"http://api.kivaws.org/v1/loans/search.json?status=fundraising"]
     @interface leagueTableViewController ()

      @end

      @implementation leagueTableViewController{

    NSMutableArray *jsonResults;
     }

    - (id)initWithStyle:(UITableViewStyle)style
    {
    self = [super initWithStyle:style];
     if (self) {
    // Custom initialization
     }
      return self;
        }

      - (void)viewDidLoad
       {
      [super viewDidLoad];

        dispatch_async(kBgQueue, ^{

           NSData* data = [NSData dataWithContentsOfURL:

                    kjsonURL];

          [self performSelectorOnMainThread:@selector(fetchedData:)

                           withObject:data waitUntilDone:YES];

             });
           }




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

           NSError* error;

           NSDictionary* json = [NSJSONSerialization

                      JSONObjectWithData:responseData

                      options:kNilOptions

                      error:&error];

       jsonResults = [json objectForKey:@"loans"];

       [self.tableView reloadData];

        }


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

      #pragma mark - Table view data source

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

      // Return the number of sections.
       return 1;
       }   

  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:   (NSInteger)section
   {
   return [jsonResults count];
  }

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

       {
      static NSString *CellIdentifier = @"Cell";

       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

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

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


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

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



     return cell;


     }

       #pragma mark - Table view delegate

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath   *)indexPath
     {
     //    NSDictionary *appsdict = [jsonResults objectAtIndex:indexPath.row];
     //    
    //    NSString *appURL = [appsdict objectForKey:@"trackViewUrl"];
     //    
    //    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:appURL]];
     }

    @end

これは、ルート要素を見ることができるように、上記のコードが使用している json の例です。

      {
       "paging": {
      "page": 1,
      "total": 873,
      "page_size": 20,
       "pages": 44
        },
       "loans": [{
        "id": 544449,
        "name": "Sajad",
        "description": {
            "languages": ["en"]
          },
          "status": "fundraising",
          "funded_amount": 0,
          "basket_amount": 0,
          "image": {
            "id": 1325179,
            "template_id": 1
           },
          "activity": "Cloth & Dressmaking Supplies",
          "sector": "Retail",
           "use": "to renovate his shop and increase his textile inventory",
           "location": {
            "country_code": "IQ",
            "country": "Iraq",
            "geo": {
                "level": "country",
                "pairs": "33 44",
                "type": "point"
            }
           },
           "partner_id": 166,
          "posted_date": "2013-04-04T15:40:01Z",
           "planned_expiration_date": "2013-05-04T15:40:01Z",
           "loan_amount": 2400,
           "borrower_count": 1
            }

これは取得する必要があるjsonですが、ルート要素がありません。これをアプリに表示するにはどうすればよいですか:

     [{
    "position": 1,
    "team_id": 10260,
    "team": "Manchester United",
    "teamshort": "Man Utd",
    "played": 30,
    "won": 25,
    "drawn": 2,
    "lost": 3,
    "for": 70,
    "against": 31,
    "difference": 39,
    "home": {
        "played": 15,
        "won": 14,
        "drawn": 0,
        "lost": 1,
        "for": 39,
        "against": 15,
        "difference": 24
    },
    "away": {
        "played": 15,
        "won": 11,
        "drawn": 2,
        "lost": 2,
        "for": 31,
        "against": 16,
        "difference": 15
    },
    "points": 77,
    "info": "championsleague"
}
4

3 に答える 3

1

JSON では、事前に構造を知っておく必要があります。データを送信する API によって、これが通知されます。

エラーが発生する理由は、NSArray を NSDictionary のように扱っているためです。例を次に示します。

これは NSArray に解析する必要があります。

[{
    username: 'johndoe'
}]

これは NSDictionanry になります。

{
   username: 'johndoe'
}

あなたが持っているデータは、私が提示した最初のケ​​ースに似ています。したがって、データを取得するには、次のようなものが必要です。

NSArray* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

[[json objectAtIndex: 0] objectForKey:@"thekey"]
于 2013-04-04T17:08:42.373 に答える
0

「ルート要素がありません」という 2 番目の応答は有効な JSONではありません。そのため、解析できません。ルート要素のない JSON などというものはありません。有効な JSON と壊れた無効な JSON だけです。いくつかのオプションがあります。

  1. @daltonclaybrookが提案したように、先頭の「[」を取り除きます。または、末尾に「]」を追加します。どちらの変更でも有効な JSON になります。サーバーが壊れたJSONを提供している場合、それは一貫して壊れていないか、ある時点で修正される可能性があるため、このアプローチは好きではありません。

  2. サーバー側の JSON を修正します。サーバーに接続している場合は、JSON が壊れていることを伝え、修正してもらいます。もしあなたがそれを直せないなら、お悔やみ申し上げます。混乱を解決できる可能性がある場合は、今度はどのように壊れているのかを突き止めて自分で修正するのではなく、そうしてください。

于 2013-04-04T16:34:13.470 に答える