不同格式的 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”的键,其中NSArray
是NSDictionaries
。
第二个列表是一样的..
编辑 1.0:
澄清一下,第二个输出是 JSON,好吗?就这样,只需检查here 并验证自己。第一个是NSObject
内的输出JSON。当然会有细微差别……
【讨论】:
我明白了,但是为什么第一个输出和第二个不一样?我将如何实现第二个输出? 你依赖的是NSLog
,而不是你知道它会在那里。我可以举个例子:我知道,我拥有的 JSON 服务正在返回像“1233”这样的字符串。问题是在NSJSONSerialization
之后我有NSNumbers
而不是NSStrings
..所以我只做stringValue
,就是这样......
作为预防措施,我复制结果并将其粘贴到在线 JSON 验证器并检查 JSON 是否正确。第一个不是,但第二个是。
这很正常...是NSLog
ged... -.-
谢谢!我才意识到;)【参考方案2】:
您的身份验证未成功完成。请检查 APPLICATION_ID 和 REST_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 不解析这个 JSON