1

有没有好的教程/源代码可以将json数据解析到cocos2d项目中?我知道如何将 jSon(也是 XML)解析到 xcode 中并显示到 tableview 中,但我需要为我的 cocos2d 项目这样做。这是我想做的事情:

#import "Eighties.h"
#import "HelloWorldLayer.h"
#import "GameScene.h"
#import "JSON.h"
#define kLatestKivaLoansURL @"http://api.kivaws.org/v1/loans/search.json?status=fundraising"
@implementation Eighties
@synthesize responseData;
+(CCScene *) scene
{
  // 'scene' is an autorelease object.
  CCScene *scene = [CCScene node];

  // 'layer' is an autorelease object.
  Eighties *layer = [Eighties node];

  // add layer as a child to scene
  [scene addChild: layer];

  // return the scene
  return scene;
}


-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super's" return value
if( (self=[super init]) ) {

    CGSize winSize = [[CCDirector sharedDirector] winSize];

    CCSprite *bg = [CCSprite spriteWithFile:@"bg.jpg"];
    [bg setPosition:ccp(winSize.width/2, winSize.height/2)];
    [self addChild:bg z:0];

    /*
    CCMenuItem *menuItems = [CCMenuItemImage itemWithNormalImage:@"back_pink.png" selectedImage:@"back_blue.png" block:^(id sender) {
        NSLog(@"Pressed");
        [[SimpleAudioEngine sharedEngine] playEffect:@"tongue-clap.wav"];
        [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[GameScene scene] withColor:ccWHITE]];
    }];
     */


    CCMenuItem *menuItems2 = [CCMenuItemImage itemWithNormalImage:@"back_pink.png" selectedImage:@"back_blue.png" target:self selector:@selector(loadData)];

    menuItems2.position = ccp(winSize.width/2-50, winSize.height/2-50);

    CCMenu *menu = [CCMenu menuWithItems:menuItems2, nil];
    menu.position = ccp(winSize.width/2, winSize.height/2);
    [self addChild:menu];





}
return self;
}

-(void)test {
NSLog(@"Success");
UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Success"
                                                  message:@"Test Method Called"
                                                 delegate:nil
                                        cancelButtonTitle:@"OK"
                                        otherButtonTitles:nil];
[message show];
}

-(void)loadData
{
self.responseData = [NSMutableData data];

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:kLatestKivaLoansURL]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[connection release];
self.responseData = nil;
}

#pragma mark -
#pragma mark Process loan data
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
self.responseData = nil;

NSArray* latestLoans = [(NSDictionary*)[responseString JSONValue] objectForKey:@"loans"];
[responseString release];

//choose a random loan
for (int i=0; i<=18; i++) {
    NSDictionary* loan = [latestLoans objectAtIndex:i];

    //fetch the data
    NSNumber* fundedAmount = [loan objectForKey:@"funded_amount"];
    NSNumber* loanAmount = [loan objectForKey:@"loan_amount"];
    //float outstandingAmount = [loanAmount floatValue] - [fundedAmount floatValue];

    //NSString* name = [loan objectForKey:@"name"];
    //NSString* country = [(NSDictionary*)[loan objectForKey:@"location"] objectForKey:@"country"];

    //set the text to the label
    /*
    label.text = [NSString stringWithFormat:@"Latest loan: %@ from %@ needs another $%.2f, please help",
                  name,country,outstandingAmount
                  ];
     */

    NSLog(@"%d",i);
    //NSLog(@"%@",label.text);
    NSLog(@"\n");
    /*
    UIAlertView *message = [[UIAlertView alloc] initWithTitle:name
                                                      message:country
                                                     delegate:nil
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [message show];
     */
}

}



@end
4

2 回答 2

1

有很多方法可以反序列化 JSON 对象,有些方法甚至被嵌入到 SDK 中。

这个问题详细介绍了解决问题的几种方法。

于 2012-12-19T02:50:25.733 回答
0

或者您可以使用 JSON 并让此实用程序为您生成解析代码 https://itunes.apple.com/us/app/json-accelerator/id511324989?mt=12

于 2013-05-08T03:13:00.253 回答