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

16,103

Solution 1

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.

Solution 2

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

Solution 3

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.

Solution 4

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.

Solution 5

#import "SBJSON.h"

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:
                                                                      @"2013-03-27",
                                                                      @"2013-04-04",
                                                                      @"2013-03-27",
                                                                      @"0",
                                                                      @"1",
                                                                      @"1",nil]
                                                             forKeys:[NSArray arrayWithObjects:
                                                                      @"startDate",
                                                                      @"endDate",
                                                                      @"selectedDate",
                                                                      @"shadowsOfID",
                                                                      @"appointmentsOfID",
                                                                      @"shadowType",nil]];


   SBJsonWriter *p = [[SBJsonWriter alloc] init];
        NSString *jsonStr = [NSString stringWithFormat:@"%@",[p stringWithObject:dictionary]];

jsonStr now contains the following:

"{\"shadowType\":\"1\",\"startDate\":\"2013-03-27\",\"selectedDate\":\"2013-03-27\",\"endDate\":\"2013-04-04\",\"shadowsOfID\":\"0\",\"appointmentsOfID\":\"1\"}";

Note that: Dictionary can be a plist file in the project.

Share:
16,103
Danny
Author by

Danny

Software engineer that loves himself some music, art, video games, and stories.

Updated on June 05, 2022

Comments

  • Danny
    Danny almost 2 years

    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?

  • Danny
    Danny about 11 years
    I like that your answer clearly created the JSON with a dictionary and that it used the data related to my original question. In this way, future searchers will find it easy to follow along.
  • Danny
    Danny about 11 years
    Love the instructions for an external file. Great response!
  • Bharat Modi
    Bharat Modi about 8 years
    @James P, how could i create the JSON file?
  • James P
    James P about 8 years
    Just put your JSON into a plain text file and change the extension from .txt to .json