JSON写入

时间:2015-12-10 15:32:15

标签: ios objective-c json nsjsonserialization gcdwebserver

我试图创建一个简单的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,并且在每种情况下都不是零。 有什么建议吗?

3 个答案:

答案 0 :(得分:3)

我不能说错误是什么,因为我在这里尝试过并且工作过。

我尝试使用NSString *vCard = nilNSString *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]