0

アプリ内からローカルでjsonファイルにアクセスする方法を理解しようとしています。現在、私は次のようなサーバーからリモートでjsonファイルを使用しています。

jsonStringCategory = @"http://****categories?country=us";
    }

    // Download the JSON file
    NSString *jsonString = [NSString
                            stringWithContentsOfURL:[NSURL URLWithString:jsonStringCategory]
                            encoding:NSStringEncodingConversionAllowLossy|NSUTF8StringEncoding
                            error:nil];

    NSLog(@"jsonStringCategory is %@", jsonStringCategory);

    NSMutableArray *itemsTMP = [[NSMutableArray alloc] init];

    // Create parser 
    SBJSON *parser = [[SBJSON alloc] init];
    NSDictionary *results = [parser objectWithString:jsonString error:nil];

    itemsTMP = [results objectForKey:@"results"];

    self.arForTable = [itemsTMP copy];

    [self.tableView reloadData];

私はこれを試しました:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"categoriesus" ofType:@"json"];


    jsonStringCategory = [[NSString alloc] initWithContentsOfFile:filePath];

ありがとう

4

3 に答える 3

8
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"json"];
NSData *jsonData = [NSData dataWithContentsOfFile:filePath];
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];
于 2013-02-15T23:39:40.057 に答える
1

CoreData を使用するのが好きです。次の手順に従います。

1-) まずモデルを作成し、jsonvalue という名前の属性文字列型を追加します。

2-) この関数を作成して、json ファイルを保存します。

    -(void)saveJson:(NSString*)d
    {

       NSString * data = [d retain];

       NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"NameObjectModel" inManagedObjectContext:context]];

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    [request release];
    // error handling code
    if(error){

    }
    else{
        Session* favoritsGrabbed = [results objectAtIndex:0];
        favoritsGrabbed.jsonvalue = data;
    }

    if(![context save:&error]){
        NSLog(@"data saved.");
    }
}

3-) JSON をロードする関数を作成します。

-(void)loadJSONFromFile
{

    //Recover data from core data.

    // Define our table/entity to use
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"NameObjectModel" inManagedObjectContext:context];

    // Setup the fetch request
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    // Define how we will sort the records - atributo que sera recuperado
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"jsonvalue" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];

    // Fetch the records and handle an error
    NSError *error;
    NSMutableArray *mutableFetchResults = [[NSMutableArray alloc]initWithArray:[context executeFetchRequest:request error:&error]];

    if (!mutableFetchResults) {
        // Handle the error.
        // This is a serious error and should advise the user to restart the application
    }

    if(mutableFetchResults.count == 0)
    {
        NSLog(@"the archive is null");
    }

    else if(mutableFetchResults.count > 0)
    {
        NameObjectModel *entity = [mutableFetchResults objectAtIndex:0];
        //NSLog(@"%@",[[entity jsonvalue] JSONValue]);
        NSDictionary * aux = [[entity jsonvalue] JSONValue];

        if([entity jsonvalue]== nil)
        {
            NSLog(@"json is nil");
            NSLog(@"the archive exists but json is nil");
        }

        else {
            // set current json data cache
            [self setJsonCache:aux]; // add to recovery list
        }

    }
    [mutableFetchResults release];
    [request release];
}

忘れないでください: NameObjectModel = NSManagedObject の名前。

于 2013-02-15T23:28:28.487 に答える
1

もっと具体的に教えていただけますか?どのファイルにアクセスしようとしていますか? もう保存しましたか?

1/ 主な問題: ファイル パスを使用して辞書または配列を作成できます。

[NSDictionary dictionaryWithContentsOfFile:<#(NSString *)#>]
[NSArray arrayWithContentsOfFile:<#(NSString *)#>]

2/しかし、あなたが書いたように、ファイルから「文字列」の内容を読み取り、最終的にそれを解析することができます。そのためには、(たとえば)このようなパスが必要です(「ディレクトリ」ディレクトリの場合、「キャッシュ」ディレクトリになる可能性があります)

NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathToFile = [ [ [ [ array objectAtIndex:0 ] stringByAppendingPathComponent:@"nameOfTheFile" ] stringByAppendingString:@".ext" ] retain ];

そして、私の 1/ の例では "pathToFile" を使用します。

3/ インターネット アクセスについては、AFNetworking を確認することをお勧めします。非同期ダウンロードを行う方が良いです;-)(あなたのものは同期です)

https://github.com/AFNetworking/AFNetworking

于 2013-02-15T23:25:12.427 に答える