Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I create dummy JSON data on the client in objective C / iOS?

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?

like image 733
Danny Avatar asked Mar 27 '13 18:03

Danny


4 Answers

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.

like image 88
James P Avatar answered Oct 06 '22 01:10

James P


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);
like image 35
Massimiliano Del Maestro Avatar answered Oct 06 '22 01:10

Massimiliano Del Maestro


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.

like image 39
meth Avatar answered Oct 06 '22 01:10

meth


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.

  • Ensure that you're including the correct braces ([{}]) and closing them off appropriately. This actually isn't a small factor, but if you're basing your data on documentation (as I was) then you might miss out on copying/pasting one of the curly braces.
  • When copying/pasting what JSON data should look like, ensure that all the characters used -- especially "quotation" marks -- are uniform. It turned out that I was using the fancy opening and closing quotation marks, which were encoded into the documentation, instead of just the " you'd type into xcode.

Once you have your valid JSON, the Foundation classes should work just fine.

like image 42
Danny Avatar answered Oct 06 '22 01:10

Danny