2012-06-24 30 views
30

Tôi đang gặp một thời gian khó phân tích cú pháp dưới đây JSON chuỗi trên iOS 5.iOS 5 JSON Parsing Kết quả trong Cocoa Lỗi 3840

{"States": [{"Name": "Arizona","Cities": [{"Name": "Phoenix"}]},{"Name": "California","Cities": [{"Name": "Orange County"},{"Name": "Riverside"},{"Name": "San Diego"},{"Name": "San Francisco"}]},{"Name": "Nevada","Cities": [{"Name": "Las Vegas"}]}]} 

Và đây là mã của tôi:

- (void) parseJson { 
NSError *jsonError = nil; 
NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"]]; 

if (jsonData) { 
    NSDictionary *jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError]; 

    if (jsonError) { 
     NSLog(@"JSON Error: %@", [jsonError localizedDescription]); 

     return; 
    } 

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

tôi tiếp tục nhận được lỗi này:

JSON Error: The operation couldn’t be completed. (Cocoa error 3840.)

tôi đánh giá cao sự giúp đỡ về vấn đề này bởi vì tôi cl sớm và không có khả năng sửa lỗi này.

+0

Liệu nó thành công thiết jsonData? –

Trả lời

22

Một điều mà đập vào mắt tôi là không chính xác là thế này:

[[NSBundle mainBundle] pathForResource:@"Locations-JSON" ofType:@"rtf"] 

Dữ liệu của bạn là một tập tin RTF ?? Tệp phải là tệp txt (hoặc bất kỳ loại tệp văn bản thuần túy nào khác). file RTF thường chứa dữ liệu định dạng văn bản, như thế này:

{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf470 
{\fonttbl\f0\fswiss\fcharset0 Helvetica;} 
{\colortbl;\red255\green255\blue255;} 
\margl1440\margr1440\vieww10800\viewh8400\viewkind0 
\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural 

\f0\fs24 \cf0 \{"States": [\{"Name": "Arizona","Cities": [\{"Name": "Phoenix"\}]\},\{"Name": "California","Cities": [\{"Name": "Orange County"\},\{"Name": "Riverside"\},\{"Name": "San Diego"\},\{"Name": "San Francisco"\}]\},\{"Name": "Nevada","Cities": [\{"Name": "Las Vegas"\}]\}]\}} 

Khi tôi đọc rằng như là một dữ liệu và cố gắng phân tích nó như JSON, tôi nhận được lỗi 3840 bạn đang nhìn thấy. Mô tả của lỗi đó cho biết:

The data couldn’t be read because it has been corrupted. (No string key for value in object around character 2.)

Vì vậy, có vẻ như tôi không thực sự có JSON. Bạn có dữ liệu RTF.

+1

Vâng, bạn đã đúng, đó là nó. Người đàn ông, tôi cảm thấy thực sự ngu ngốc ngay bây giờ ... Cảm ơn sự giúp đỡ mặc dù. – Gup3rSuR4c

1

Nếu bạn đến đây vì JSON và không phải vì các RTF, xin vui lòng kiểm tra câu trả lời này: IOS JSON Deserialization failure - STIG/NSJSONSerializer

+1

Tôi nhận được lỗi này vì chỉ có JSON không hợp lệ (theo sau; ở cuối định nghĩa đối tượng JSON). Lời khuyên chung có thể là để xác minh JSON của bạn bằng cách sử dụng bất kỳ trang web trình xác thực JSON nào ở ngoài đó. –

10

tôi đã trúng một vấn đề tương tự. Trình phân tích cú pháp JSON của tôi hoạt động không liên tục khi tôi tải xuống dữ liệu JSON từ máy chủ. Bạn có nhận được dữ liệu JSON của mình từ chức năng này không?

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

NSData được trả về từ chức năng này có thể là một phần dữ liệu. Bạn cần phải nối thêmData vào một biến cá thể với kiểu: NSMutableData. Sau đó, bạn xử lý JSON của mình trong một chức năng khác như sau:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 

Đọc bài viết này để biết chi tiết. Nó làm việc cho tôi

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

10

tôi đã có thể khắc phục lỗi JSON 3840 của tôi bằng cách chuyển đổi các đối tượng NSData một NSString:

NSError *error; 

NSObject *object = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error]; 

if (object == nil) { 
    NSString *serverResponse = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding]; 

    NSLog(@"\n\nError:\n%@\n\nServer Response:\n%@\n\nCrash:", error.description, serverResponse); 
    [NSException raise:@"Invalid Data" format:@"Unable to process web server response."]; 
} 
+0

điều này đã giúp tôi. bạn có ý kiến ​​gì về phản ứng này có nghĩa là @kraftydevil không? Máy chủ đã gặp lỗi nội bộ và không thể hoàn thành yêu cầu của bạn. Máy chủ bị quá tải hoặc có lỗi trong ứng dụng – SleepsOnNewspapers

+1

@ hsavit1 Kiến thức của tôi dừng ngay tại không gian gốc. Lỗi của bạn chắc chắn là một vấn đề với máy chủ/dịch vụ web nhưng nó trên đầu của tôi. – kraftydevil

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