Chuyển đổi NSString sang NSDictionary / JSON


83

Tôi có dữ liệu sau được lưu dưới dạng NSString:

 {
    Key = ID;
    Value =         {
        Content = 268;
        Type = Text;
    };
},
    {
    Key = ContractTemplateId;
    Value =         {
        Content = 65;
        Type = Text;
    };
},

Tôi muốn chuyển đổi dữ liệu này thành một NSDictionarycó chứa các cặp giá trị khóa.

Tôi đang cố gắng đầu tiên để chuyển đổi NSStringđến một JSON đối tượng như sau:

 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

Tuy nhiên khi tôi thử:

NSString * test = [json objectForKey:@"ID"];
NSLog(@"TEST IS %@", test);

Tôi nhận được giá trị như NULL.

Bất cứ ai có thể đề xuất vấn đề là gì?


1
Xin lưu ý rằng ở đây trong chuỗi json đã cho "ID" là giá trị, không phải là khóa.
Sunil Zalavadiya

NSLog (@ "JSON IS% @", json); ??????
Prasad G

Câu trả lời:


258

Tôi tin rằng bạn đang hiểu sai định dạng JSON cho các giá trị chính. Bạn nên lưu trữ chuỗi của mình dưới dạng

NSString *jsonString = @"{\"ID\":{\"Content\":268,\"type\":\"text\"},\"ContractTemplateID\":{\"Content\":65,\"type\":\"text\"}}";
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

Bây giờ nếu bạn làm theo câu lệnh NSLog

NSLog(@"%@",[json objectForKey:@"ID"]);

Kết quả sẽ là một NSDictionary khác.

{
    Content = 268;
    type = text;
}

Hy vọng điều này sẽ giúp hiểu rõ ràng.


1
Không thực sự là một câu trả lời cho câu hỏi vì bạn yêu cầu người đó định dạng lại chuỗi của họ. Trong một số trường hợp (ví dụ: biên nhận IAP định dạng iOS6), bạn được cung cấp một chuỗi ở định dạng này.
Chris Prince

1
Bạn luôn được tự do đăng câu trả lời ngay cả với những câu hỏi đã được chấp nhận câu trả lời. Vì vậy, vui lòng nhanh chóng đăng phiên bản câu trả lời của bạn và liên hệ với OP để xem xét sửa đổi câu trả lời được chấp nhận. :)
Janak Nirmal

1
BTW OP đã đăng JSON? Bạn có chắc chắn về điều đó không? Vui lòng kiểm tra yêu cầu của OP và có thể đạt được trong định dạng đó không? Nếu có, hãy trả lời câu hỏi và tôi sẽ tán thành và sẽ tạo tiền thưởng mới và trao nó cho bạn.
Janak Nirmal

14

Tôi nghĩ rằng bạn nhận được mảng từ phản hồi vì vậy bạn phải chỉ định phản hồi cho mảng.

NSError * err = nil;
NSArray * array = [NSJSONSerialization JSONObjectWithData: [string dataUsingEncoding: NSUTF8StringEncoding] tùy chọn: NSJSONReadingMutableContainers error: & err];
NSDictionary * dictionary = [array objectAtIndex: 0]; 
NSString * test = [từ điển objectForKey: @ "ID"];
NSLog (@ "Kiểm tra là% @", kiểm tra);

6

Sử dụng mã này trong đó str là chuỗi JSON của bạn:

NSError *err = nil;
NSArray *arr = 
 [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] 
                                 options:NSJSONReadingMutableContainers 
                                   error:&err];
// access the dictionaries
NSMutableDictionary *dict = arr[0];
for (NSMutableDictionary *dictionary in arr) {
  // do something using dictionary
}

[arr count] đang trả về 0.
GuybrushThreepwood,

LỖI là Tên miền Lỗi = NSCocoaErrorDomain Code = 3840 "Không thể hoàn thành thao tác. (Lỗi ca cao 3840.)" (Văn bản JSON không bắt đầu bằng mảng hoặc đối tượng và tùy chọn cho phép phân đoạn không được đặt.) UserInfo = 0x1f5b3660 {NSDebugDescription = JSON văn bản đã không bắt đầu với mảng hoặc đối tượng và tùy chọn cho phép các mảnh vỡ không được thiết lập}.
GuybrushThreepwood

cái gì đó đang bị thay đổi trong dữ liệu json của bạn
Woodstock

2

Swift 3:

if let jsonString = styleDictionary as? String {
    let objectData = jsonString.data(using: String.Encoding.utf8)
    do {
        let json = try JSONSerialization.jsonObject(with: objectData!, options: JSONSerialization.ReadingOptions.mutableContainers) 
        print(String(describing: json)) 

    } catch {
        // Handle error
        print(error)
    }
}

0

Sử dụng mã sau để lấy đối tượng phản hồi từ AFHTTPSessionManagerkhối lỗi; thì bạn có thể chuyển đổi kiểu chung thành kiểu dữ liệu bắt buộc:

id responseObject = [NSJSONSerialization JSONObjectWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] options:0 error:nil];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.