I want to set up static dummy data, in JSON, for my app to process. This is purely client-side; I don't want to retrieve anything from the network.
All the questions and answers I've seen so far have NSData* variables storing what's retrieved from network calls and [JSONSerialization JSONObjectWithData: ...] usually acting on data that was not created manually.
Here's an example of what I've tried within xcode.
NSString* jsonData = @" \"things\": [{ \
\"id\": \"someIdentifier12345\", \
\"name\": \"Danny\" \
\"questions\": [ \
{ \
\"id\": \"questionId1\", \
\"name\": \"Creating dummy JSON data by hand.\" \
}, \
{ \
\"id\": \"questionId2\", \
\"name\": \"Why no workie?\"
} \
], \
\"websiteWithCoolPeople\": \"http://stackoverflow.com\", \
}]}";
NSError *error;
NSDictionary *parsedJsonData = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
Attempts like that (and trying to change things, like switching the NSString* to NSData* from that JSON string) have yielded a null parsedJsonData data or exceptions when trying to create that JSON data variable or when trying to parse it.
How do I create dummy JSON data within my own code such that it can be parsed through the normal Foundation classes that parse JSON data?
I would save my test json as separate files in the app. The advantage of this is that you can just copy & paste responses from a web service and read them easily without having to convert them to NSDictionaries or escaped strings.
I've correctly formatted your JSON (using jsonlint) and saved it to a file named testData.json
in the app bundle.
{"things":
[{
"id": "someIdentifier12345",
"name": "Danny",
"questions": [
{
"id": "questionId1",
"name": "Creating dummy JSON data by hand."
},
{
"id": "questionId2",
"name": "Why no workie?"
}
],
"websiteWithCoolPeople": "http://stackoverflow.com"
}]
}
Then in order to parse this file in your app you can simply load the file from the bundle directory.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"testdata" ofType:@"json"];
NSData *jsonData = [[NSData alloc] initWithContentsOfFile:filePath];
NSError *error = nil;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
NSLog(@"%@", jsonDict);
It would now be pretty easy to extend this to load any number of responses and essentially have a local web service. It then wouldn't be much more work to adapt this to load responses from a remote server.
Try something like this!!
NSDictionary *jsonObject = @{@"id": @"someIdentifier",
@"name":@"Danny",
@"questions":@[
@{@"id":@"questionId1",
@"name":@"Creating dummy JSON"},
@{@"id":@"questionId2",
@"name":@"Creating dummy JSON"},
@{@"id":@"questionId3",
@"name":@"Creating dummy JSON"}],
@"websiteCoolPeople":@"http://stackoverflow.com"};
NSLog(@" JSON = %@",jsonObject); // let's see if is correct
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:nil];
NSLog(@" JSON DATA \n %@",[NSString stringWithCString:[jsonData bytes] encoding:NSUTF8StringEncoding]);
//lets make a check
if ([NSJSONSerialization isValidJSONObject:jsonObject] == YES) {
NSLog(@" ;) \n");
}
else{
NSLog(@"Epic Fail! \n");
}
//Going back
NSDictionary *parsedJSONObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:nil];
NSLog(@"Cool! : %@",parsedJSONObject);
first of all
-(void)createJsonData
{
//your objects for json
NSArray * objects=@[@"object1",@"object2",@"object3",@"object4"];
//your keys for json
NSArray * keys=@[@"key1",@"key2",@"key3",@"key4"];
//create dictionary to convert json object
NSDictionary * jsonData=[[NSMutableDictionary alloc] initWithObjects:objects forKeys:keys];
//convert dictionary to json data
NSData * json =[NSJSONSerialization dataWithJSONObject:jsonData options:NSJSONWritingPrettyPrinted error:nil];
//convert json data to string for showing if you create it truely
NSString * jsonString=[[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
NSLog(@"%@",jsonString);
}
this creates a jsonData. another fact is that to create data you should use dataWithJSONObject. and this method accepts NSDictionary or NSArray. NSString is not valid class for this method.
The answer is in creating correctly formed JSON. If your JSON is malformed when you create it manually, then you will just get the blanket "null" value from the serialization. Here are things that drove me crazy because they were small factors until @bgoers mentioned one of them.
Once you have your valid JSON, the Foundation classes should work just fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With