2013-07-17 35 views
1

我想讀取我的Objective-C應用程序中的json文件,但不幸的是我得到一個RuntimeException。確切的錯誤是:嘗試閱讀Objective-C中的JSON文件

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil' 

我的JSON文件被稱爲「Transactions.json

[{ "transaction": "300001", "date": "1/1/11", "type": "ABC", "status": "State1" }, 
    { "transaction": "300002", "date": "2/2/12", "type": "XYZ", "status": "State2" }, 
    { "transaction": "300003", "date": "3/3/13", "type": "ABC", "status": "State3" }, 
    { "transaction": "300004", "date": "2/2/12", "type": "XYZ", "status": "State2" }, 
    { "transaction": "300005", "date": "3/3/13", "type": "ABC", "status": "State3" }, 
    { "transaction": "300006", "date": "2/2/12", "type": "XYZ", "status": "State2" }, 
    { "transaction": "300007", "date": "3/3/13", "type": "ABC", "status": "State3" }, 
    { "transaction": "300008", "date": "2/2/12", "type": "XYZ", "status": "State2" }, 
    { "transaction": "300009", "date": "3/3/13", "type": "ABC", "status": "State3" }, 
    { "transaction": "300010", "date": "4/4/14", "type": "XYZ", "status": "State4" } ] 

我的方法讀取文件看起來是這樣的:

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 
     // Create the managed object context 
     NSManagedObjectContext *context = managedObjectContext(); 

     // Custom code here... 
     // Save the managed object context 
     NSError *error = nil; 
     if (![context save:&error]) { 
      NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error"); 
      exit(1); 
     } 

     NSError *err = nil; 
     NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Transactions" ofType:@"json"]; 
     NSLog(@"Hello: %@", dataPath); 
     NSArray *transaction = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath] options:kNilOptions error:&err]; 

       NSLog(@"Transaction list: %@", transaction); 

    } 

    return 0; 
} 

我不什麼」不明白爲什麼當我讀取JSON文件時,NSData對象會變成空值?任何人都可以看到我在做什麼錯了嗎?只是爲了記錄,我試圖檢查JSON文件中的多餘空格,並且嘗試過placin g我的應用程序文件夾中的不同位置的JSON文件,並沒有任何工作。

在此先感謝所有回覆的人。

+0

這是iOS還是OSx? 「dataPath」記錄的值是什麼? –

+0

而且,一般來說:不要「連鎖」操作在一起。將NSData指針分配給一個臨時變量,然後使用該臨時變量來提供NSJSONSerialization。使調試更簡單。 –

+0

並記錄「err」中的內容。 –

回答

2

從您的源代碼和您的意見我假設該應用程序被構建爲 「命令行工具」。在這種情況下,「Target MemberShip」複選框實際上是 ,對於像JSON文件這樣的自定義資源文件是禁用的。

作爲一種變通方法:

  • 轉到目標 「構建階段」。
  • 點擊「添加生成階段」並選擇「添加複製文件」。
  • 在新建階段,點擊+並選擇您的JSON文件。

對於命令行工具,似乎並不關心您選擇哪個「目的地」。 我使用「目的地:資源」對其進行了測試。 JSON文件被複制到包含可執行文件的相同 目錄中。現在

[[NSBundle mainBundle] pathForResource:@"Transactions" ofType:@"json"]; 

應該返回該路徑,您可以從您的應用程序中讀取該文件。