问题
Currently I am writing an app (Target iOS 6, ARC enabled) that uses JSON for data transmission and Core Data for persistent storage. The JSON data is generated out of a MySQL database by a PHP script via json_encode.
My Problem is that with data from certain tables the following code fails:
- (NSDictionary *)executeFetch:(NSString *)query
{
NSURL *requesturl = [NSURL URLWithString:[query stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSError *dataError = nil;
self.jsonData = [NSData dataWithContentsOfURL:requesturl options:kNilOptions error:&dataError];
NSError *error = nil;
self.jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:self.jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];
return self.jsonSerializationResult;
}
The program always crashes with an EXC_BAD_ACCESS error on the line where it says self.jsonSerializationResult and Instruments says that there was a Zombie detected. I know that this means that some object I send a message to is nil, but I can't find out how to fix it... That's what Instruments has to say:
# Address Category Event Type RefCt Timestamp Size Responsible Library Responsible Caller
0 0xa1b8a70 CFString (mutable) Malloc 1 00:01.603.081 32 Foundation -[NSPlaceholderMutableString initWithBytesNoCopy:length:encoding:freeWhenDone:]
1 0xa1b8a70 CFString (mutable) Release 0 00:01.603.137 0 Foundation newJSONValue
2 0xa1b8a70 CFString (mutable) Zombie -1 00:01.603.259 0 Foundation newJSONString
My program works with every JSON output except for this one:
{
"termin":[
{
"termin_id":"17",
"veranstaltung_id":"20",
"beginn":"2012-09-28 17:00:00",
"ende":"2012-09-28 18:00:00",
"freie_pl\u00e4tze":null
},
{
"termin_id":"18",
"veranstaltung_id":"26",
"beginn":"2012-09-28 19:00:00",
"ende":"2012-09-28 20:00:00",
"freie_pl\u00e4tze":null
},
{
"termin_id":"19",
"veranstaltung_id":"26",
"beginn":"2012-09-28 21:00:00",
"ende":"2012-09-28 22:00:00",
"freie_pl\u00e4tze":null
},
{
"termin_id":"20",
"veranstaltung_id":"46",
"beginn":"2012-09-28 19:00:00",
"ende":"2012-09-28 20:00:00",
"freie_pl\u00e4tze":null
},
{
"termin_id":"24",
"veranstaltung_id":"66",
"beginn":"2012-09-28 22:00:00",
"ende":"2012-09-28 22:30:00",
"freie_pl\u00e4tze":"120"
}
]
}
I thought about some possible error sourced but none seems to be the responsible:
- jsonData or jsonSerializationResult could be nil: they aren't
- PHP generated invalid JSON: checked for that with a validator
- null Values: not a problem with other tables
Has anybody got an idea?
回答1:
It looks like a bug/shortcoming with NSJSONSerialization
. The problem is caused by the escaped unicode characters (freie_pl\u00e4tze
instead of freie_plätze
). You have two options -
- Convert the escaped Unicode to real Unicode characters. Try this SO answer
- Use another JSON engine, such as JSONKit.
JSONKit
also claims to be more performant thanNSJSONSerialization
.
回答2:
I know this question has been answered but I think some beginners may have the same issue as me and be brought to this question.
The EXC_BAD_ACCESS message was caused by malformed JSON. As I had accidentally used the same name for an Object which causes issues when converting the JSON into a dictionary.
Annoyingly it didn't bring up a formatting error. Here is an example of the JSON that caused the issue:
"levels" : {
"level1": {
....
},
"level1": {
... << All objects should have different names. This should be called level2.
},
"level3": {
...
}
To fix the issue I had to ensure that all objects of the same level had different names.
回答3:
Just tested NSJSONSerialization today. With iOS 7.1. It is working. No issue found. Looks like Apple fixed the issue.
NSString* jsonString = @"{ \"freie_pl\\u00e4tze\":null}";
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary* jsonSerializationResult = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:&error];
NSLog(@"%@", jsonSerializationResult);
来源:https://stackoverflow.com/questions/12842481/nsjsonserialization-results-in-exc-bad-access