ios 解析复杂的json数据

曌孤寒 发布于 2013/05/24 10:46
阅读 8K+
收藏 0

我采用两种办法解析数据都不成功,求大侠解救!

 我的json数据的组成是这样的:服务器是把一个Arraylist<object A>转换为Json的,同时ArrayList的每一个object A当中又包含了一个ArrayList<object B>:数据类型如下:

[{"CAjk":"","CBh":"EFE3268D1AE4B9B59B0D19B0C78A1EAE","CCfcs":"北京","pwlist":[{"CBh":"EFE3268D1AE4B9B59B0D19B0C78A1EAE","qfsj":"2013-5-23"}{"CBh":"EFE3268D1AE4B9B59B0D39B0C78A1EAE","qfsj":"2013-5-23"}]}{{"CAjk":"","CBh":"EFE3268D1AE4B9B59B0D19B0C88A1EAE","CCfcs":"北京","pwlist":[{"CBh":"EFE3268D1AE4B9B59B0D19B0C78A2EAE","qfsj":"2013-5-23"}{"CBh":"EFE3268D1AE4B9B59B0D39B0C78A3EAE","qfsj":"2013-5-23"}]}]


我试过的第一种方法是 采用原生的自带的json解析

 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:response  options:NSJSONReadingMutableLeaves error:&error];

另一种方法是用第三方的包JSONKit解析

 NSDictionary *dic =[data objectFromJSONData];

这两种方法都无法把数据转换为数据字典,我在找问题的时候发现,如果我把ArrayList的每一个object A当中又包含了一个ArrayList<object B>去掉就可以解析出来。如果加进去就解析不出来了,请问各位大侠,这个问题怎么样解决啊???急啊啊啊啊啊~~~~


.......................................................................

最后找到原因 并不是因为解析数据的问题,原因是:

首先:我用下面的代码连接服务器

- (void)viewDidLoad

{

 NSURL *finalURL = [NSURL URLWithString:urlWithParams];

 NSURLRequest    *urlRequest = [NSURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];

 NSURLConnection *urlConnection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];

 [urlConnection start];

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

{

   由于我刚刚学IOS所以对这里的机制不了解,我以为这里返回的数据是完整的,然后就开始扒拉扒拉解析数据,

   在这里data是多次返回的,数据并不完整,数据量多的时候,我很难发现。所以我们需要完整的数据。

   于是需要下面的这一行代码。

   

    [_receiveData appendData:data];//记得声明@property NSMutableData *receiveData;

   

}

真正的解析要在下面的这里开始

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

    [self jiexiJson];

}

-(void)jiexiJson{

    NSError *error=nil;

    NSDictionary *resultDir=[NSJSONSerialization JSONObjectWithData:_receiveData options:NSJSONReadingMutableContainers error:&error];

    NSArray *resultArray=(NSArray *)resultDir;

    NSUInteger resultcount=[resultDir count];

    for (int i=0; i<resultcount; i++) {

        NSDictionary *data1=[resultArray objectAtIndex:i];

        FlightInto *flight=[FlightInto alloc];

        [flight setCBh:[data1 objectForKey:@"CBh"]];

        [flight setCAjk:[data1 objectForKey:@"CAjk"]];

        [flight setCCfcs:[data1 objectForKey:@"CCfcs"]];

        [flight setCDdcs:[data1 objectForKey:@"CDdcs"]];

        [flight setCDjk:[data1 objectForKey:@"CDjk"]];

        [flight setCFjxh:[data1 objectForKey:@"CFjxh"]];

         。。。。。。。。。。。

    }


}


加载中
0
皮总
皮总


其实我不应该回答你的问题, 你的提问很不负责任, 随便搅和几句就求答案 :


ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://192.168.2.12/test.txt"]];
    
    [request setDefaultResponseEncoding:NSUTF8StringEncoding];
    [request setResponseEncoding:NSUTF8StringEncoding];
    [request addRequestHeader:@"Content-Type" value:@"application/xml;charset=UTF-8;"];
    [request startSynchronous];
    
    NSError *error = [request error];
    NSArray *httpjson = [[NSArray alloc]init];
    
    if(!error) {
        NSString *response = [request responseString];
        NSData *responsedata = [response dataUsingEncoding:NSUTF8StringEncoding];
        httpjson = [responsedata objectFromJSONData];
        
        NSDictionary *data1 = [httpjson objectAtIndex:1];
        
        NSLog(@"%@",[data1 objectForKey:@"CBh"]);
        NSLog(@"%@",[[[data1 objectForKey:@"pwlist"]objectAtIndex:1]objectForKey:@"qfsj"]);
        
    } else {
        NSLog(@"ERROR");
    }

运行结果是 :

2013-05-24 12:40:27.256 aaa[718:c07] EFE3268D1AE4B9B59B0D19B0C88A1EAE 2013-05-24 12:40:27.256 aaa[718:c07] 2013-5-23

0
皮总
皮总

我根本就听不明白你在说什么, 贴 JSON , 贴代码

曌孤寒
曌孤寒
恩 json的数据类型我贴上去了,你如果可以告诉我怎么解析就好了,谢谢。。。。。。
0
皮总
皮总

我怎么觉得你的 JSON 格式有问题, 不是少了很多逗号吗

[
   {"CAjk":"","CBh":"EFE3268D1AE4B9B59B0D19B0C78A1EAE","CCfcs":"北京","pwlist":     [
	{"CBh":"EFE3268D1AE4B9B59B0D19B0C78A1EAE","qfsj":"2013-5-23"}
	{"CBh":"EFE3268D1AE4B9B59B0D39B0C78A1EAE","qfsj":"2013-5-23"}
     ]
    }
    {"CAjk":"","CBh":"EFE3268D1AE4B9B59B0D19B0C88A1EAE","CCfcs":"北京","pwlist":[
	{"CBh":"EFE3268D1AE4B9B59B0D19B0C78A2EAE","qfsj":"2013-5-23"}
	{"CBh":"EFE3268D1AE4B9B59B0D39B0C78A3EAE","qfsj":"2013-5-23"}
	]
}
]
曌孤寒
曌孤寒
上面多了一个大括号 { 在第二条数据 的前面“CAJK”
曌孤寒
曌孤寒
恩 数据量很多,我就是大概复制了一些,逗号应该是不小心掉了,不过,数据的结构就是这样了。
0
dake
dake
我用SBJson..还好..
曌孤寒
曌孤寒
恩,那我去下载包 试一下。
0
曌孤寒
曌孤寒

引用来自“皮总”的答案


其实我不应该回答你的问题, 你的提问很不负责任, 随便搅和几句就求答案 :


ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://192.168.2.12/test.txt"]];
    
    [request setDefaultResponseEncoding:NSUTF8StringEncoding];
    [request setResponseEncoding:NSUTF8StringEncoding];
    [request addRequestHeader:@"Content-Type" value:@"application/xml;charset=UTF-8;"];
    [request startSynchronous];
    
    NSError *error = [request error];
    NSArray *httpjson = [[NSArray alloc]init];
    
    if(!error) {
        NSString *response = [request responseString];
        NSData *responsedata = [response dataUsingEncoding:NSUTF8StringEncoding];
        httpjson = [responsedata objectFromJSONData];
        
        NSDictionary *data1 = [httpjson objectAtIndex:1];
        
        NSLog(@"%@",[data1 objectForKey:@"CBh"]);
        NSLog(@"%@",[[[data1 objectForKey:@"pwlist"]objectAtIndex:1]objectForKey:@"qfsj"]);
        
    } else {
        NSLog(@"ERROR");
    }

运行结果是 :

2013-05-24 12:40:27.256 aaa[718:c07] EFE3268D1AE4B9B59B0D19B0C88A1EAE 2013-05-24 12:40:27.256 aaa[718:c07] 2013-5-23

不好意思,我的问题确实是很不负责的,我当当是随便说了几句就要答案,最不负责的是:其实我的问题,不是应该解析数据有问题,是因为我用了USURLConnection 取的数据,在didReceiveData当中就开始解析数据,在这一个方法中,数据不是一下子全部都取回的,是分批取的,所以取的数据不完整,才导致解析失败的。(刚刚接触ios两个星期,所以对于一些方法的机制不了解。) 最后非常感谢你的热心回答!
返回顶部
顶部