Question

I have a NSDictionary containing a few different objects, among which is a NSArray.

Elements in the array are NSDictionary-representations of a custom object. I have renamed the properties and removed some others for simplicity.

First I try to simply serialize the NSArray like this, just to see what it would look like:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:&writeError];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

The result looks like this, which is what I expected:

[
  {
    "someProperty" : "Value 1"
  },
  {
    "someProperty" : "Value 2"
  }
]

However, when I add the (unencoded) array to a NSDictionary and serialize that in stead the array looks different:

NSMutableArray *myArray = [NSMutableArray array];
[myArray addObject:[object1 dictionaryRepresentation]]; // dictionaryRepresentation returns a NSDictionary
[myArray addObject:[object2 dictionaryRepresentation]];

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[dictionary setObject:myArray forKey:@"myArray"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&writeError];
NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

Now the result looks like this:

{
  myArray =     (
                  {
            "someProperty" : "Value 1"
        },
                  {
            "someProperty" : "Value 2"
        }
  );
}

In stead of getting "myArray" : [...] I get myArray = (...); which is not the proper JSON representation.

What is the correct way of making it use the JSON representation of the NSArray when adding it to the dictionary?

Was it helpful?

Solution

In the first case, you are printing out the result of the JSON encoding operation.

In the second case, you are printing out the dictionary directly via NSLog and not its JSON representation.

Update:

To see this, use this logging function instead of NSLog:

void logThisObject(id obj)
{
    if(obj == nil) {
        NSLog(@"logObject: nil");
    } else {
        NSString *className = NSStringFromClass([obj class]);
        NSLog(@"logObject: an %@: %@", className, obj);
    }
}

Update 2:

void test_it()
{
    NSArray *myArray = @[@"bla", @"foo"];
    NSError *writeError = nil;

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    [dictionary setObject:myArray forKey:@"myArray"];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&writeError];
    if(writeError) {
        NSLog(@"an error happened: %@", writeError);
    }
    logThisObject([[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
}

this outputs proper JSON string:

logObject: an __NSCFString: {
  "myArray" : [
    "bla",
    "foo"
  ]
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top