问题
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?
回答1:
I can't say what is the error, because I tried here and worked.
I tried with NSString *vCard = nil
and NSString *vCard = @"SOMESTRING"
, both cases it worked.
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];
}
Make sure [BRContacts getContacts]
returning a NSString
, and I just rewrite to a modern syntax the NSDictionary
declaration.
回答2:
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.
回答3:
Swift 4: Worth Considering
JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject]
instead of
JSONSerialization.data(withJSONObject: data, options: []) as? [String:AnyObject]
来源:https://stackoverflow.com/questions/34205813/invalid-top-level-type-in-json-write