不同格式的 NSJSONSerialization 数据

Posted

技术标签:

【中文标题】不同格式的 NSJSONSerialization 数据【英文标题】:NSJSONSerialization data in a different format 【发布时间】:2013-03-21 10:43:14 【问题描述】:

我正在使用 Parse.com 作为我的应用程序的后端,我目前正在那里存储数据。

数据是视频游戏机的列表。我能够输出它,但输出不是 JSON 数据,而是一个大的 NSMutableArray。

这是我的 viewDidLoad:

- (void)viewDidLoad

    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"https://api.parse.com/1/classes/Consoles"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setURL:url];
    [request setHTTPMethod:@"GET"];
    [request setValue:@"APPLICATION_ID" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [request setValue:@"REST_API_KEY" forHTTPHeaderField:@"X-Parse-REST-API-Key"];

    NSError *error;

    id listOfConsoles = [NSJSONSerialization JSONObjectWithData:[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil] options:NSJSONReadingMutableContainers error:&error];

    NSLog(@"The list: %@", listOfConsoles);

输出:

The list: 
    results =     (
                
            createdAt = "2013-03-21T07:26:04.149Z";
            name = PlayStation;
            objectId = vloIK0MZIA;
            updatedAt = "2013-03-21T07:26:04.149Z";
        ,
                
            createdAt = "2013-03-21T07:26:34.209Z";
            name = Wii;
            objectId = RIRpgbznlq;
            updatedAt = "2013-03-21T07:26:34.209Z";
        ,
                
            createdAt = "2013-03-21T07:26:39.391Z";
            name = Xbox;
            objectId = xBNgHtJbrV;
            updatedAt = "2013-03-21T07:26:39.391Z";
        
    );

我想要的输出是什么:


  "results" : [
    
      "objectId" : "vloIK0MZIA",
      "updatedAt" : "2013-03-21T07:26:04.149Z",
      "createdAt" : "2013-03-21T07:26:04.149Z",
      "name" : "PlayStation"
    ,
    
      "objectId" : "RIRpgbznlq",
      "updatedAt" : "2013-03-21T07:26:34.209Z",
      "createdAt" : "2013-03-21T07:26:34.209Z",
      "name" : "Wii"
    ,
    
      "objectId" : "xBNgHtJbrV",
      "updatedAt" : "2013-03-21T07:26:39.391Z",
      "createdAt" : "2013-03-21T07:26:39.391Z",
      "name" : "Xbox"
    
  ]

顺便说一句

为什么当我在代码中有一个单独的NSData时:

NSData *JSONData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

并将我的 NSJSONSerialization 更改为:

id listOfConsoles = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableContainers error:&error];

输出将是:

The list: 
    error = unauthorized;

【问题讨论】:

有什么理由不使用 Parse 的 ios SDK? 没什么特别的。我最近刚刚遇到 Parse.com,并且正在使用它的 SDK。 【参考方案1】:

第一个列表是一个NSDictionary,其中有一个名为“results”的键,其中NSArrayNSDictionaries

第二个列表是一样的..

编辑 1.0:

澄清一下,第二个输出是 JSON,好吗?就这样,只需检查here 并验证自己。第一个是NSObject 内的输出JSON。当然会有细微差别……

【讨论】:

我明白了,但是为什么第一个输出和第二个不一样?我将如何实现第二个输出? 你依赖的是NSLog,而不是你知道它会在那里。我可以举个例子:我知道,我拥有的 JSON 服务正在返回像“1233”这样的字符串。问题是在NSJSONSerialization之后我有NSNumbers而不是NSStrings..所以我只做stringValue,就是这样...... 作为预防措施,我复制结果并将其粘贴到在线 JSON 验证器并检查 JSON 是否正确。第一个不是,但第二个是。 这很正常...是NSLogged... -.- 谢谢!我才意识到;)【参考方案2】:

您的身份验证未成功完成。请检查 APPLICATION_IDREST_API_KEY 值。

【讨论】:

如果认证不成功,为什么我有第一个输出? 请在收到回复和收到列表时告诉我确切的步骤: 错误 = 未授权; 如果我有一个单独的 NSData 行并在 NSJSONSerialization 中手动调用它,我会得到一个 error = unauthorized。但是,如果 NSData 没有单独的行,我可以生成输出。【参考方案3】:

我是个白痴。当我想要 JSON 数据时,我从未意识到我试图将 JSON 转换为其他东西。

- (void)viewDidLoad

    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"https://api.parse.com/1/classes/Consoles"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request setURL:url];
    [request setHTTPMethod:@"GET"];
    [request setValue:@"APPLICATION_ID" forHTTPHeaderField:@"X-Parse-Application-Id"];
    [request setValue:@"REST_API_KEY" forHTTPHeaderField:@"X-Parse-REST-API-Key"];

    NSString *listOfConsoles = [[NSString alloc] initWithData:[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil] encoding:NSUTF8StringEncoding];

    NSLog(@"%@", listOfConsoles);

【讨论】:

以上是关于不同格式的 NSJSONSerialization 数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSJSONSerialization 将 NSMutableDictionary 转换为 JSON 会返回不同的结果

NSJSONSerialization 将 \n 添加到 JSON 字符串的开头和结尾

NSJSONSerialization 未正确映射布尔值

NSJSONSerialization 不解析这个 JSON

NSJSONSerialization 和 SBJson 工作异常

iOS NSJSONSerialization 嵌套 NSDictionary 作为 POST 请求序列化时的键