代码之家  ›  专栏  ›  技术社区  ›  Jack Shultz

为什么我的JSON响应对象没有加载到字典中?

  •  0
  • Jack Shultz  · 技术社区  · 10 年前

    我正在测试JSON POST。我有工作岗位。我现在正在尝试处理JSON响应对象。我按照一个例子载入字典。

    NSMutableDictionary *innerJson = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error1];

    innerJson似乎没有可用的数据。我尝试了两种方法注销所有密钥。

    -(IBAction)trigger:(id)sender
    {
        NSString *message = @"Test Message";
        NSString *number = @"xxxxxxxxx";
        NSString *adId = @"4321";
        NSString *idfv = @"1234";
        NSURL *someURLSetBefore = [NSURL URLWithString:@"http://localhost:3000/messaging"];
        NSLog(@"%@",someURLSetBefore);
        NSLog(message);
        //[[CTMessageCenter sharedMessageCenter]  sendSMSWithText:message serviceCenter:nil toAddress:number];
        //build an info object and convert to json
        NSDictionary *newDatasetInfo = [NSDictionary dictionaryWithObjectsAndKeys:adId, @"adId", idfv, @"idfv", nil];
    
        //convert object to data
        NSError *error = nil;
        NSData* jsonData = [NSJSONSerialization dataWithJSONObject:newDatasetInfo options:kNilOptions error:&error];
    
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        [request setURL:someURLSetBefore];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
        [request setHTTPBody:jsonData];
    
        // print json:
        NSLog(@"JSON summary: %@", [[NSString alloc] initWithData:jsonData
                                                         encoding:NSUTF8StringEncoding]);
        //NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
        //[connection start];
        [NSURLConnection
         sendAsynchronousRequest:request
         queue:[[NSOperationQueue alloc] init]
         completionHandler:^(NSURLResponse *response,
                             NSData *data,
                             NSError *error) {
             NSLog(@"error: %@", error);
             NSLog(@"data: %@", data);
             NSLog(@"response: %@", response);
    
             NSError *error1;
             NSMutableDictionary *innerJson = [NSJSONSerialization
                                                JSONObjectWithData:data options:kNilOptions error:&error1
                                                ];
             NSLog(@"allKeys");
             for( NSString *aKey in [innerJson allKeys] )
             {
                 // do something like a log:
                 NSLog(aKey);
             }
    
             NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
             if ([data length] >0 && error == nil && [httpResponse statusCode] == 200)
             {
             NSLog(@"dataAsString %@", [NSString stringWithUTF8String:[data bytes]]);
                 // DO YOUR WORK HERE
                 if ([innerJson objectForKey:@"status"]) {
                     // contains key
                     NSLog(@"status exists");
                 }
             }
    
         }];
    }
    

    这是日志

    2015-03-21 19:01:39.140 MayDay[70643:367300] http://localhost:3000/messaging
    2015-03-21 19:01:39.140 MayDay[70643:367300] Test Message
    2015-03-21 19:01:39.140 MayDay[70643:367300] JSON summary: {"adId":"4321","idfv":"1234"}
    2015-03-21 19:01:39.256 MayDay[70643:367351] error: (null)
    2015-03-21 19:01:39.256 MayDay[70643:367351] data: <227b2073 74617475 73203a20 276f6b27 207d22>
    2015-03-21 19:01:39.257 MayDay[70643:367351] response: <NSHTTPURLResponse: 0x7ff8a1e363c0> { URL: http://localhost:3000/messaging } { status code: 200, headers {
        Connection = "keep-alive";
        "Content-Length" = 19;
        "Content-Type" = "application/json; charset=utf-8";
        Date = "Sat, 21 Mar 2015 23:01:39 GMT";
        "Set-Cookie" = "connect.sid=s%3A0-PALFYCrFKdwL5_k1bNaRhrz811XcFi.ki24wSPdIOua6OiWDSkO2%2FlSvaA%2B9ZBg1TkxF9Ou4b4; Path=/; HttpOnly";
        Vary = "X-HTTP-Method-Override, Accept-Encoding";
        "X-Content-Type-Options" = nosniff;
        "X-Download-Options" = noopen;
        "X-Frame-Options" = SAMEORIGIN;
        "X-XSS-Protection" = "1; mode=block";
    } }
    2015-03-21 19:01:39.257 MayDay[70643:367351] allKeys
    2015-03-21 19:01:39.257 MayDay[70643:367351] dataAsString "{ status : 'ok' }"
    

    更新

    错误1日志

    error1 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x7f8af9f1b7a0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   gnasher729    10 年前

    如果这是您收到的回复:

    { status : 'ok' }
    

    那么它看起来类似于JSON,但不是JSON。

    正确的JSON应该是:

    { "status" : "ok" }
    

    任何JSON解析器都不会接受您收到的响应。字符串状态必须在双引号内,字符串“ok”也是如此。