首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSJSONSerialization不工作,NSUTF8StringEncoding在工作

NSJSONSerialization不工作,NSUTF8StringEncoding在工作
EN

Stack Overflow用户
提问于 2014-03-11 12:50:23
回答 4查看 3.4K关注 0票数 2

我已经阅读了文档、教程和其他Stack Q&A,并且不知道如何让我的JSON使用NSUTF8StringEncoding出现,而不是使用NSJSONSerialization --这正是我需要将数据提取到NSDictionaryNSArray中所需要的。我相信这是一个问题,NSData的格式是从我的网址返回?

编辑这里是错误:错误Domain=NSCocoaErrorDomain Code=3840“操作无法完成。(可可错误3840)。(最后是垃圾)UserInfo=0x8aabc30

代码语言:javascript
复制
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sampleURL.com"]
                                          cachePolicy:NSURLRequestUseProtocolCachePolicy
                                      timeoutInterval:15.0];

NSMutableData* responseData = [NSMutableData dataWithCapacity: 0];

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

    //this works, and have NSLog below
    responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"string %@", responseString);

    [responseData appendData:data];
    responseData = [[NSMutableData alloc] initWithData:data];

     //this is null in NSLog
    NSError * error;
    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data   options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&error];

    NSLog(@"jsonDict dict %@",jsonDict); 
}

调试控制台:

代码语言:javascript
复制
 2014-03-11 07:41:58.233 WBPC[7845:a0b] string   {"id":"a1","session":"General","name":"Exhibitor Setup Begins","startTime":"0900","details":"9am Exhibitor Hall","png":"image","speaker1":"Johnson","speaker2":"Nelson","speaker3":""}{"id":"b1","session":"General","name":"Conference Registration","startTime":"1000","details":"10am Noon Upper Level Lobby","png":"image","speaker1":"Jackson","speaker2":"","speaker3":""}
 2014-03-11 07:41:58.236 WBPC[7845:a0b] jsonDict (null)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-11 14:08:45

您的JSON格式不太好。您告诉我们它是(为便于阅读而添加的空格和行间隔):

代码语言:javascript
复制
{
    "id": "a1",
    "session": "General",
    "name": "Exhibitor Setup Begins",
    "startTime": "0900",
    "details": "9am Exhibitor Hall",
    "png": "image",
    "speaker1": "Johnson",
    "speaker2": "Nelson",
    "speaker3": ""
}{
    "id": "b1",
    "session": "General",
    "name": "Conference Registration",
    "startTime": "1000",
    "details": "10am Noon Upper Level Lobby",
    "png": "image",
    "speaker1": "Jackson",
    "speaker2": "",
    "speaker3": ""
}

这在两个字典条目之间缺少了一个逗号,还缺少了应该包装JSON的[]。如果它确实是一组字典条目,那么应该是:

代码语言:javascript
复制
[
    {
        "id": "a1",
        "session": "General",
        "name": "Exhibitor Setup Begins",
        "startTime": "0900",
        "details": "9am Exhibitor Hall",
        "png": "image",
        "speaker1": "Johnson",
        "speaker2": "Nelson",
        "speaker3": ""
    },
    {
        "id": "b1",
        "session": "General",
        "name": "Conference Registration",
        "startTime": "1000",
        "details": "10am Noon Upper Level Lobby",
        "png": "image",
        "speaker1": "Jackson",
        "speaker2": "",
        "speaker3": ""
    }
]

如果您想检查JSON,可以访问http://jsonlint.com。另外,如果您检查了由error返回的JSONObjectWithData对象,它将指出正确的方向。

您应该看看JSON是如何生成的。它看起来一定是手动生成的。例如,如果您是从PHP页面生成这个JSON,则应该使用json_encode,而不是手动生成JSON。

顺便说一句,您正在尝试在didReceiveData中解析结果。在connectionDidFinishLoading之前,您不应该尝试解析。您的didReceiveData只应该将data附加到NSMutableData对象。解析应该推迟到connectionDidFinishLoading

票数 3
EN

Stack Overflow用户

发布于 2014-03-11 12:57:57

所有这些都是在'didReceiveData‘委托函数中完成的,这不是正确的位置。唯一应该存在的是:

代码语言:javascript
复制
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.responseData appendData:data];
}

但在此之前,当连接收到响应时,您应该初始化“self.responseData”:

代码语言:javascript
复制
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if(self.responseData != nil) self.responseData = nil;
    self.responseData = [[NSMutableData alloc] init];
}

然后,您需要实现另一个名为“connectionDidFinishLoading”的委托函数,当这个方法被调用时,您的'responseData‘将包含来自JSON的所有数据,并准备解析:

代码语言:javascript
复制
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {

     responseString = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];

     NSLog(@"string %@", responseString);

     NSError * error;
     NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&error];

     NSLog(@"jsonDict dict %@",jsonDict); 
}

我希望这能在某种程度上有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2014-03-11 13:00:36

嗨你可以试试这个。

代码语言:javascript
复制
NSError *error = nil;
NSArray *jsonResponseArray = [NSJSONSerialization JSONObjectWithData: YOURDATA options: NSJSONReadingMutableContainers error: &error];

if (!jsonResponseArray) {
  NSLog(@"Error: %@", error);
} else {
   for(NSDictionary *dic in jsonResponseArray) {
      NSLog(@"dic values are : %@", item);
   }
}

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22326273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档