2012-11-28 39 views
22

Tôi đang sử dụng dữ liệu NSJSONSerializationWithJSONObject để tuần tự hóa các lớp của tôi thành JSON. Khi nó tuần tự hóa một BOOL, nó cho nó giá trị 1 hoặc 0 trong chuỗi JSON. Tôi cần điều này đúng hoặc sai. Điều này có thể làm một cách tổng quát không?Làm cách nào để có được NSJSONSerialization để xuất một boolean là true hoặc false?

+0

Bất kỳ câu nào trong số này thực sự là câu trả lời thực sự: http://stackoverflow.com/a/17234722/105903 hoặc http://stackoverflow.com/a/28450291/105903. Tâm trí đánh dấu nó như vậy? –

+0

Trừ khi bạn là một bảng thời gian, nó không phải là câu trả lời thực sự. Xin lưu ý ngày câu hỏi này được hỏi và trả lời. Cảm ơn bạn. –

Trả lời

3

Không, đối tượng nền tảng cho một Bool là NSNumbernumberWithBool, trở thành 0 hoặc 1. Chúng tôi không có đối tượng Bool. Cùng đi đọc JSON. True/false sẽ trở thành NSNumber một lần nữa.

Bạn có thể tạo Lớp học Bool và tạo trình phân tích cú pháp của riêng bạn. Mảng là Mảng và JSON Đối tượng là NSDictionary. Bạn có thể truy vấn các khóa, kiểm tra Lớp nào nằm phía sau và xây dựng chuỗi JSON từ đây.

+2

cảm ơn, tôi đã tạo lớp JSONBool của riêng mình và có thể làm cho nó hoạt động như thế mà tâm trí –

+0

@TritonMan đăng thêm mã trong lớp JSONBool? Đang cố gắng thực hiện điều tương tự. – TahoeWolverine

+0

Vâng, cách thức hoạt động của NSJSONSerialization đã thay đổi qua các năm. Xin lưu ý ngày câu hỏi này được hỏi và trả lời. –

22

Khi tôi tạo [NSNumber numberWithBool:NO], NSJSONSerialization trả về từ "sai" trong chuỗi JSON.

EDIT Với các phím tắt mới, bạn cũng có thể sử dụng những kẻ ích:

@(YES)/ @(NO) 
@(1) / @(0) 
@YES / @NO 
@1 / @0 

Bằng cách này bạn có thể tránh được một cái gì đó giống như vòng lặp thông qua giá trị của bạn. Tôi muốn có hành vi ngược lại chính xác nhưng có các đối tượng NSNumber. Vì vậy, tôi phải vòng lặp ...

EDIT II

mbi chỉ ra trong các ý kiến ​​rằng có một sự khác biệt giữa các phiên bản iOS. Vì vậy, đây là một thử nghiệm iOS9:

NSDictionary *data = @{ 
    @"a": @(YES), 
    @"b": @YES, 
    @"c": @(1), 
    @"d": @1 
}; 
NSLog(@"%@", [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]); 

2016-07-05 02:23:43.964 Test App[24581:6231996] {"a":true,"b":true,"c":1,"d":1} 
+2

Có một chút báo trước giữa các phiên bản iOS tại đây! Mã này '[NSJSONSerialization dataWithJSONObject: @ {@" Test1 ": @YES, @" Test2 ": @ (YES), @" Test3 ": @true, @" Test4 ": @ (true)} tùy chọn: Nil error: nil] ' tạo ra json này trên iOS 9 ' {"Test4": true, "Test3": true, "Test2": true, "Test1": true} ' nhưng tạo ra json này trên iOS 8 và bên dưới '{" Test4 ": 1," Test3 ": 1," Test2 ": true," Test1 ": true}' – mbi

+0

Thú vị ... Cảm ơn bạn đã quan sát! –

+0

Không, tôi không thấy điều đó. Tôi sẽ xóa bình luận của tôi. Cảm ơn bạn đã chỉ ra! –

12

Chỉ cần chạy qua này bản thân mình, không chắc chắn nếu điều này là câu trả lời tốt nhất nhưng ...

Hãy chắc chắn để sử dụng @YES hoặc @NO, sau đó json outputted của bạn sẽ có đúng/sai trong nó:

[NSJSONSerialization dataWithJSONObject:@{@"test": @YES} options:0 error: nil]; 

vì vậy, bạn sẽ phải bật khác "boolean" của bạn/boolean như giá trị -> @YES/@NO khi đưa vào từ điển cho dataWithJSONObject.

[NSJSONSerialization dataWithJSONObject:@{@"test": (boolLikeValue ? @YES : @NO)} options:0 error: nil]; 
0

Tôi gặp sự cố tương tự khi sử dụng boolean của CoreData, được lưu trữ dưới dạng NSNumber. Giải pháp đơn giản nhất đối với tôi là sử dụng @():

[NSJSONSerialization dataWithJSONObject:@{@"bool": @([object.value boolValue])} options:0 error: nil]; 

Tôi đoán @() không nhận ra giá trị BOOL và khởi tạo NSNumber với numberWithBool: dẫn đến đúng/sai trong JSON

3

Vâng, nó có thể sản lượng một boolean (đúng/sai) với NSJSONSerialization bằng cách sử dụng kCFBooleanTruekCFBooleanFalse:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1", 
          kCFBooleanFalse, @"key_2", 
          nil] 

sau đó

NSError *error = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error]; 
1

Tôi vừa gặp sự cố trên iOS9. Trường hợp của tôi là tôi có thuộc tính CoreData workout.private là bool được ánh xạ tới NSNumber * do xử lý CoreData.

Khi tạo JSON [NSNumber numberWithBool:workout.private.boolValue] bộ dự kiến ​​đúng/sai trong JSON, nhưng chỉ workout.private hoặc @ (workout.private.boolValue) đặt "1" hoặc "0".

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