2014-05-21 26 views
8

Tôi đang sử dụng dịch vụ API của dịch vụ web và được viết trong mô tả của họ rằng họ gửi dữ liệu JSON cũng khớp với ý kiến ​​của tôi với phản hồi tôi nhận được từ đó. Dưới đây là một phần của nó mà tôi nhận được từ các NSURLConnection-Đại biểu (kết nối didReceiveData: (NSData *) dữ liệu) và chuyển đổi trong một NSString sử dụng:Chuyển đổi JSON NSData thành NSDictionary

NSLog(@"response: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 

Đây đoạn:

{"scans": 
{ 
    "Engine1“: 
    { 
     "detected": false, 
     "version": "1.3.0.4959", 
     "result": null, 
     "update": "20140521" 
    }, 
    "Engine2“: 
    { 
     "detected": false, 
     "version": "12.0.250.0", 
     "result": null, 
     "update": "20140521" 
    }, 
     ... 
    }, 
    "Engine13": 
    { 
     "detected": false, 
     "version": "9.178.12155", 
     "result": 

Trong NSLog-String nó dừng lại ở đó. Bây giờ tôi muốn biết từ bạn whats sai mà tôi không thể chuyển đổi dữ liệu này cho một người điển JSON với dòng mã này:

NSError* error; 
    NSMutableDictionary *dJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error]; 

tôi thử nghiệm với một số tùy chọn nhưng lúc nào cũng báo lỗi tương tự:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" 
(Unexpected end of file while parsing object.) UserInfo=0x109260850 {NSDebugDescription=Unexpected end of file while parsing object.} 

Mọi thứ đều chỉ ra rằng gói JSON không đầy đủ nhưng tôi không biết cách kiểm tra nó hoặc cách tìm kiếm vấn đề cần được đặt trong mã của tôi.

+2

có vẻ như API đang gửi dữ liệu chưa hoàn chỉnh hoặc cắt ngắn. Không có gì bạn có thể làm được. –

+2

Bạn không thể chuyển đổi nó vì nó không đầy đủ. Bạn đang cố gắng chuyển đổi nó trong didReceiveData: hoặc trong connectionDidFinishLoading :? Nếu nó trong didReceiveData thì nó sẽ không đầy đủ nếu HTTP đã phân chia nó và bạn phải chuyển đổi nó trong connectionDidFinishLoading sau khi bạn đã tập hợp lại nó. – Gruntcakes

+0

Có @ MartinH bạn đúng và tôi đã làm như Rajeev đã viết trong câu trả lời của mình quá! Cảm ơn nhiều! – user3191334

Trả lời

12

Bạn đã triển khai tất cả các phương thức ủy nhiệm của NSURLConnectionDelagate. Có vẻ như bạn đang lấy dữ liệu để chuyển đổi từ kết nối "- (void): (NSURLConnection *) didReceiveData: (NSData *)". Nếu vậy bạn có thể nhận được dữ liệu không đầy đủ và không thể chuyển đổi được.

Hãy thử điều này:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    // A response has been received, this is where we initialize the instance var you created 
    // so that we can append data to it in the didReceiveData method 
    // Furthermore, this method is called each time there is a redirect so reinitializing it 
    // also serves to clear it 
    lookServerResponseData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // Append the new data to the instance variable you declared 
    [lookServerResponseData appendData:data]; 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // The request is complete and data has been received 
    // You can parse the stuff in your instance variable now 
    NSError *errorJson=nil; 
    NSDictionary* responseDict = [NSJSONSerialization JSONObjectWithData:lookServerResponseData options:kNilOptions error:&errorJson]; 

    NSLog(@"responseDict=%@",responseDict); 

    [lookServerResponseData release]; 
    lookServerResponseData = nil; 
} 

Ở đây, lookServerResponseData là thể hiện của NSMutableData tuyên bố trên toàn cầu.

Hy vọng điều đó sẽ hữu ích.

+0

WOW! Cảm ơn bạn rất nhiều! Bạn đã đúng nó chỉ là một phần của phản ứng tôi nhận được và tôi quên sử dụng các đại biểu khác và nối thêm tất cả dữ liệu vào JSON cuối cùng! Tôi rất hạnh phúc haha ​​- công việc tuyệt vời! – user3191334

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