我试图创建一个简单的JSON对象,但我仍然遇到错误,我知道代码中的错误:
NSString *vCard = [BRContacts getContacts]; // this is just a string, could be nil
NSDictionary *JSONdic = nil;
if (vCard)
{
JSONdic = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"status",vCard,@"data", nil];
}
else
{
JSONdic = [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"status",@"vCard is empty",@"error", nil];
}
NSError *error = nil;
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSONdic options:NSJSONWritingPrettyPrinted error:&error];
return [GCDWebServerDataResponse responseWithJSONObject:JSONdata];
例外是
JSON写入中的顶级类型无效
我也检查了JSONdic
,并且在每种情况下都不是零。
有什么建议吗?
答案 0 :(得分:3)
我不能说错误是什么,因为我在这里尝试过并且工作过。
我尝试使用NSString *vCard = nil
和NSString *vCard = @"SOMESTRING"
,两种情况都有效。
NSString *vCard = @"SOMESTRING"; // this is just a string, could be nil
NSDictionary *JSONdic = nil;
if (vCard) {
JSONdic = @{@"status" : @"1", @"data" : vCard};
} else {
JSONdic = @{@"status" : @"0", @"error" : @"vCard is empty"};
}
NSError *error = nil;
NSData *JSONData = [NSData data];
if ([NSJSONSerialization isValidJSONObject:JSONdic]) {
JSONData = [NSJSONSerialization dataWithJSONObject:JSONdic options:NSJSONWritingPrettyPrinted error:&error];
}
确保[BRContacts getContacts]
返回NSString
,我只需将NSDictionary
声明重写为现代语法。
答案 1 :(得分:2)
好的,我解决了。这是一个与这条线有关的问题:
return [GCDWebServerDataResponse responseWithJSONObject:JSONdata];
此 GCDWebServer 的响应并不需要JSON NSData
而是NSDictionary
:错误只是因为responseWithJSONObject
处理输入以进行创建一个JSON对象(我传递了一个JSON"预处理"对象)。所以我的错误与我的初始代码无关,所以我现在更新它以供将来参考,我解决了使用:
return [GCDWebServerDataResponse responseWithJSONObject:JSONdic];
根据类似问题的documentation,请务必遵循以下规则:
可以转换为JSON的对象必须具有以下内容 属性:
- 顶级对象是NSArray或NSDictionary。
- 所有对象都是 NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
- 所有字典键都是NSString的实例。
- 数字不是NaN或无穷大。
答案 2 :(得分:0)
Swift 4: 值得考虑
JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject]
而不是
JSONSerialization.data(withJSONObject: data, options: []) as? [String:AnyObject]