Недопустимый тип верхнего уровня в записи JSON

Я пытаюсь создать простой объект 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, и это не ноль во всех случаях. Какие-либо предложения?


person Massimo Polimeni    schedule 10.12.2015    source источник
comment
Мне интересно, как развернуть некоторые данные JSON в GCDWebServer, тогда я мог бы отправить запрос JSON на этот фиктивный сервер и проверить ответ. Не могли бы вы дать мне какую-нибудь ссылку, например, код или пример?   -  person ChuckZHB    schedule 25.06.2020


Ответы (3)


Хорошо, я решил. Это была проблема, связанная с этой строкой:

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 или бесконечность.
person Massimo Polimeni    schedule 10.12.2015
comment
Это действительно полезно, означает ли это, что нам не нужно сериализовать данные json, вместо этого это сделает responseWithJSONObject (потому что responseWithJSONObject обрабатывает ввод для создания объекта JSON) - person ChuckZHB; 26.06.2020

Я не могу сказать, в чем ошибка, потому что я пробовал здесь и работал.

Пробовал с 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.

person Felipe Docil    schedule 10.12.2015
comment
Проверено, altro попробовал с вашим примером кода тот же результат :( - person Massimo Polimeni; 10.12.2015
comment
Что произойдет, если вы войдете JSONData, если я войду с vCard = @"SOMESTRING", вот что я получу: > JSONData = <7b0a2020 22737461 74757322 203a2022 31222c0a 20202264 61746122 203a2022 534f4d45 53545249 4e47220a 7d> И error = nil - person Felipe Docil; 10.12.2015
comment
Я получаю <7b0a2020 22737461 74757322 203a2022 31222c0a 20202264 61746122 203a2022 534f4d45 53545249 4e47220a 7d> и не знаю почему, но теперь моя ошибка nil. Все еще есть то же исключение: \ - person Massimo Polimeni; 10.12.2015
comment
Хм, может быть, не в той части кода. Я почти уверен, что это JSONData правильно. - person Felipe Docil; 10.12.2015
comment
Обновил ответ, не могли бы вы проверить, входите ли вы в этот if - person Felipe Docil; 10.12.2015

Swift 4: заслуживает внимания

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

вместо

JSONSerialization.data(withJSONObject: data, options: []) as? [String:AnyObject]
person Naishta    schedule 30.04.2018