7

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

4

3 回答 3

4

好的,我解决了。这是与此行相关的问题:

return [GCDWebServerDataResponse responseWithJSONObject:JSONdata];

GCDWebServer的此响应不需要 JSON NSData,而是NSDictionary:错误只是因为responseWithJSONObject处理输入以创建 JSON 对象(并且我传递了 JSON“预处理”对象)。所以我的错误与我的初始代码无关,所以我刚刚更新了它以供将来参考,我使用以下方法解决了:

return [GCDWebServerDataResponse responseWithJSONObject:JSONdic]; 

根据类似问题的文档,请务必遵循以下规则:

可以转换为 JSON 的对象必须具有以下属性:

  • 顶级对象是 NSArray 或 NSDictionary。
  • 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。
  • 所有字典键都是 NSString 的实例。
  • 数字不是 NaN 或无穷大。
于 2015-12-10T17:17:47.290 回答
3

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

我尝试了NSString *vCard = niland 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]返回 a NSString,我只是将NSDictionary声明重写为现代语法。

于 2015-12-10T15:51:41.360 回答
2

Swift 4: 值得考虑

JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject]

代替

JSONSerialization.data(withJSONObject: data, options: []) as? [String:AnyObject]
于 2018-04-30T21:38:31.573 回答