Search code examples
iosobjective-cjsonnsjsonserializationgcdwebserver

Invalid top-level type in JSON write


I'm trying to create a simple JSON object but I still get error and I know what's wrong in my code:

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];

The exception is

Invalid top-level type in JSON write

I checked also JSONdic and it's not nil in every case. Any suggestions?


Solution

  • Ok I solved. It was a problem related to this line:

    return [GCDWebServerDataResponse responseWithJSONObject:JSONdata];
    

    this response of GCDWebServer doesn't want a JSON NSData but a NSDictionary: the error is just because responseWithJSONObject process the input for create a JSON object (and I passed a JSON "pre-processed" object). So my error is not related to my initial code so I updated it just now for future reference, I solved using:

    return [GCDWebServerDataResponse responseWithJSONObject:JSONdic]; 
    

    According to the documentation for similar problem be sure to follow this rules:

    An object that may be converted to JSON must have the following properties:

    • The top level object is an NSArray or NSDictionary.
    • All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.
    • All dictionary keys are instances of NSString.
    • Numbers are not NaN or infinity.