2013-03-27 13 views
9

Tôi muốn thiết lập dữ liệu giả tĩnh, trong JSON, để ứng dụng của tôi xử lý. Điều này hoàn toàn là phía máy khách; Tôi không muốn lấy bất cứ thứ gì từ mạng.Làm cách nào để tạo dữ liệu JSON giả trên máy khách trong C/iOS mục tiêu?

Tất cả các câu hỏi và câu trả lời tôi đã thấy cho đến nay có các biến NSData * lưu trữ những gì được truy xuất từ ​​cuộc gọi mạng và [JSONSerialization JSONObjectWithData: ...] thường tác động đến dữ liệu không được tạo thủ công.

Dưới đây là ví dụ về những gì tôi đã thử trong xcode.

NSString* jsonData = @" \"things\": [{ \ 
\"id\": \"someIdentifier12345\", \ 
\"name\": \"Danny\" \ 
\"questions\": [ \ 
    { \ 
     \"id\": \"questionId1\", \ 
     \"name\": \"Creating dummy JSON data by hand.\" \ 
    }, \ 
    { \ 
     \"id\": \"questionId2\", \ 
     \"name\": \"Why no workie?\" 
    } \ 
    ], \ 
\"websiteWithCoolPeople\": \"http://stackoverflow.com\", \ 
}]}"; 

NSError *error; 
NSDictionary *parsedJsonData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error]; 

Những nỗ lực như vậy (và cố gắng thay đổi điều gì đó, như chuyển NSString * để NSData * từ đó chuỗi JSON) đã mang lại một dữ liệu parsedJsonData null hoặc trường hợp ngoại lệ khi cố gắng tạo mà JSON biến dữ liệu hoặc khi cố gắng phân tích nó.

Làm cách nào để tạo dữ liệu JSON giả trong mã của riêng tôi sao cho nó có thể được phân tích cú pháp thông qua các lớp Foundation bình thường phân tích cú pháp dữ liệu JSON?

+1

Tôi không tin rằng JSON có thể bắt đầu bằng chuỗi. Hãy thử thêm '{' vào đầu trước '' mọi thứ ''. Sau đó, lấy chuỗi của bạn và sử dụng phương thức '[jsonData dataUsingEncoding: NSUTF8StringEncoding]', vì 'NSJSONSerialization' chỉ lấy dữ liệu chứ không phải một chuỗi :) – bgoers

+0

Cảm ơn. Tôi đã thử tuyến đường đó trước đây, nhưng bạn đã đưa ra ánh sáng rằng tôi có thể có JSON không đúng định dạng, đó là lý do tại sao tôi không thể tạo dữ liệu theo cách thủ công. Hãy cẩn thận để đăng một ví dụ nhỏ về cách JSON nên xem xét trong khi tôi thử JSON mới? Nếu nó hoạt động, sau đó tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời vì mọi người cố gắng làm điều này có thể đã làm cho JSON bị biến dạng thành vấn đề. – Danny

+1

Khi tôi cần phải làm điều này tôi có một tập tin văn bản có chứa các json trong gói ứng dụng chứ không phải là một NSString trong mã. Tôi nghĩ điều đó giúp bạn dễ dàng trao đổi hơn cho URL sản xuất của mình và cũng dễ định dạng hơn. –

Trả lời

20

Tôi sẽ lưu json thử nghiệm của mình dưới dạng các tệp riêng biệt trong ứng dụng. Ưu điểm của việc này là bạn chỉ có thể sao chép & dán phản hồi từ dịch vụ web và đọc chúng một cách dễ dàng mà không phải chuyển đổi chúng thành NSDictionaries hoặc chuỗi thoát.

Tôi đã định dạng chính xác JSON của bạn (sử dụng jsonlint) và lưu nó vào tệp có tên testData.json trong gói ứng dụng.

{"things": 
    [{ 
    "id": "someIdentifier12345", 
    "name": "Danny", 
    "questions": [ 
        { 
        "id": "questionId1", 
        "name": "Creating dummy JSON data by hand." 
        }, 
        { 
        "id": "questionId2", 
        "name": "Why no workie?" 
        } 
        ], 
    "websiteWithCoolPeople": "http://stackoverflow.com" 
    }] 
} 

Sau đó, để phân tích cú pháp tệp này trong ứng dụng của bạn, bạn chỉ cần tải tệp từ thư mục gói.

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"testdata" ofType:@"json"]; 
NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath]; 

NSError *error = nil; 
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error]; 

NSLog(@"%@", jsonDict); 

Bây giờ sẽ dễ dàng mở rộng việc này để tải bất kỳ số lượng câu trả lời nào và về cơ bản có dịch vụ web cục bộ. Sau đó sẽ không có nhiều công việc để thích ứng với điều này để tải phản hồi từ một máy chủ từ xa.

+0

Yêu các hướng dẫn cho tệp bên ngoài. Phản ứng tuyệt vời! – Danny

+0

@James P, làm thế nào tôi có thể tạo tệp JSON? –

+0

Chỉ cần đặt JSON của bạn vào một tệp văn bản thuần túy và thay đổi phần mở rộng từ .txt thành .json –

1

Câu trả lời là tạo JSON được định dạng chính xác. Nếu JSON của bạn không đúng định dạng khi bạn tạo nó theo cách thủ công, thì bạn sẽ chỉ nhận được giá trị "null" của chăn từ tuần tự hóa. Dưới đây là những thứ khiến tôi phát điên vì chúng là những yếu tố nhỏ cho đến khi @bgoers đề cập đến một trong số đó.

  • Đảm bảo rằng bạn đã bao gồm dấu ngoặc nhọn chính xác ([{}]) và đóng chúng một cách thích hợp. Điều này thực sự không phải là một yếu tố nhỏ, nhưng nếu bạn đang căn cứ dữ liệu của bạn trên tài liệu (như tôi đã) sau đó bạn có thể bỏ lỡ sao chép/dán một trong những niềng răng xoăn.
  • Khi sao chép/dán dữ liệu JSON trông như thế nào, hãy đảm bảo rằng tất cả các ký tự được sử dụng - đặc biệt là dấu ngoặc kép - đều đồng nhất. Hóa ra tôi đã sử dụng các dấu trích dẫn mở và đóng mở, được mã hóa thành tài liệu, thay vì chỉ là "bạn nhập vào xcode.

Khi bạn có JSON hợp lệ, lớp Foundation nên chỉ làm việc tốt

1
#import "SBJSON.h" 

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects: 
                     @"2013-03-27", 
                     @"2013-04-04", 
                     @"2013-03-27", 
                     @"0", 
                     @"1", 
                     @"1",nil] 
                  forKeys:[NSArray arrayWithObjects: 
                     @"startDate", 
                     @"endDate", 
                     @"selectedDate", 
                     @"shadowsOfID", 
                     @"appointmentsOfID", 
                     @"shadowType",nil]]; 


    SBJsonWriter *p = [[SBJsonWriter alloc] init]; 
     NSString *jsonStr = [NSString stringWithFormat:@"%@",[p stringWithObject:dictionary]]; 

jsonStr bây giờ chứa những điều sau đây:.

"{\"shadowType\":\"1\",\"startDate\":\"2013-03-27\",\"selectedDate\":\"2013-03-27\",\"endDate\":\"2013-04-04\",\"shadowsOfID\":\"0\",\"appointmentsOfID\":\"1\"}"; 

Lưu ý rằng:. từ điển có thể là một tập tin plist trong dự án

4

Hãy thử một cái gì đó như thế này !!

NSDictionary *jsonObject = @{@"id": @"someIdentifier", 
          @"name":@"Danny", 
          @"questions":@[ 
              @{@"id":@"questionId1", 
               @"name":@"Creating dummy JSON"}, 
              @{@"id":@"questionId2", 
               @"name":@"Creating dummy JSON"}, 
              @{@"id":@"questionId3", 
               @"name":@"Creating dummy JSON"}], 
          @"websiteCoolPeople":@"http://stackoverflow.com"}; 


NSLog(@" JSON = %@",jsonObject); // let's see if is correct 

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:nil]; 

NSLog(@" JSON DATA \n %@",[NSString stringWithCString:[jsonData bytes] encoding:NSUTF8StringEncoding]); 


//lets make a check 

if ([NSJSONSerialization isValidJSONObject:jsonObject] == YES) { 

    NSLog(@" ;) \n"); 
} 
else{ 

    NSLog(@"Epic Fail! \n"); 

} 


//Going back 

NSDictionary *parsedJSONObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil]; 


NSLog(@"Cool! : %@",parsedJSONObject); 
+0

Tôi thích câu trả lời của bạn đã tạo JSON bằng từ điển và sử dụng dữ liệu liên quan đến câu hỏi ban đầu của tôi. Bằng cách này, những người tìm kiếm trong tương lai sẽ thấy dễ dàng theo dõi. – Danny

2

trước hết

-(void)createJsonData 
{ 
    //your objects for json 
    NSArray * [email protected][@"object1",@"object2",@"object3",@"object4"]; 
    //your keys for json 
    NSArray * [email protected][@"key1",@"key2",@"key3",@"key4"]; 

    //create dictionary to convert json object 
    NSDictionary * jsonData=[[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys]; 


    //convert dictionary to json data 
    NSData * json =[NSJSONSerialization dataWithJSONObject:jsonData options:NSJSONWritingPrettyPrinted error:nil]; 


    //convert json data to string for showing if you create it truely 
    NSString * jsonString=[[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]; 

    NSLog(@"%@",jsonString); 
} 

điều này tạo ra một jsonData. một thực tế khác là để tạo dữ liệu, bạn nên sử dụng dataWithJSONObject. và phương thức này chấp nhận NSDictionary hoặc NSArray. NSString không phải là lớp hợp lệ cho phương thức này.

0

Để tải tệp JSON cục bộ trong iOS, chúng tôi cần phải chuyển sang giai đoạn xây dựng, bằng cách chọn mục tiêu, tải tệp bằng tài nguyên gói sao chép. Sau đó, xây dựng tệp. Đơn giản chỉ cần thêm nó bằng cách làm theo 'tập tin-> tập tin mới -> khác -> trống' thủ tục wont làm việc. (Tôi đã đấu tranh cho 4 giờ để nhận được kết quả mong đợi.)

P.S. Tôi không thể bình luận vì có ít danh tiếng hơn.

Các vấn đề liên quan