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?
Trả lời
Không, đối tượng nền tảng cho một Bool là NSNumber
numberWithBool
, 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.
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í –
@TritonMan đăng thêm mã trong lớp JSONBool? Đang cố gắng thực hiện điều tương tự. – TahoeWolverine
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. –
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}
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
Thú vị ... Cảm ơn bạn đã quan sát! –
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! –
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];
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
Vâng, nó có thể sản lượng một boolean (đúng/sai) với NSJSONSerialization bằng cách sử dụng kCFBooleanTrue và kCFBooleanFalse:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1",
kCFBooleanFalse, @"key_2",
nil]
sau đó
NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error];
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".
- 1. Làm thế nào để có PHP boolean FALSE được đầu ra như FALSE chỉ
- 2. Java: boolean trong println (boolean "in true": "in false")
- 3. AutomaticMigrationsEnabled false hoặc true?
- 4. Làm thế nào tôi có thể chuyển đổi bool true hoặc false thành chuỗi "True" hoặc "False"
- 5. TSQL để trở NO hoặc YES thay TRUE hoặc FALSE
- 6. Mã gọn gàng để chuyển đổi bool [] -> "false, true, true, false"
- 7. Cách truyền 1 và 0 thành true và false trong Ruby. Muốn có một boolean hoặc logic ra
- 8. Cú pháp Java nào là "== null? False: true;"
- 9. Giản đồ JSON - làm cách nào để xác định rằng giá trị boolean phải là false?
- 10. Làm thế nào để đặt biến python thành true hoặc false?
- 11. Hộp thoại xác nhận Android trả về true hoặc false
- 12. asp: TextBox ReadOnly = true hoặc Enabled = false?
- 13. `true = false` có nghĩa là gì trong Coq?
- 14. Rails (hoặc Ruby): Có/Không thay vì True/False
- 15. Là hoặc Có để tiền tố các giá trị boolean
- 16. python pandas/numpy True/False để 1/0 ánh xạ
- 17. Đường ray: form_for được đặt thành true hoặc false cho dù hộp được chọn/bỏ chọn
- 18. Đây có phải là thành ngữ pythonic? (someBool và "True Result" hoặc "False Result")
- 19. Làm thế nào để thiết lập giá trị Boolean để một 'Có' hoặc 'Không' h: selectOneRadio
- 20. Javascript booleans: false && true results in
- 21. làm cách nào để bao gồm boolean AND trong regex?
- 22. Xuất một boolean từ một Rscript vào biến Bash
- 23. TRUE và FALSE không có tác dụng trong vòng SUM()
- 24. Làm cách nào để lấy System.Windows.ShowDialog() để trả về 'true'?
- 25. Values MV3 Duplicate Query String cho CheckBox (true, false cho boolean)
- 26. Giá trị nào nên được sử dụng cho trường Mysql BOOL: TRUE/FALSE hoặc 1/0, tại sao?
- 27. Cách chuyển đổi "0" và "1" thành false và true
- 28. Xem trợ giúp: classBinding nếu boolean là false
- 29. Mã sau đây in "true, true, false, true". Không nên là "đúng, đúng, đúng, đúng"?
- 30. Đối tượng RESTKit Thuộc tính BOOL thành true/false JSON
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? –
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. –