Search code examples
iosobjective-cjsonnsmutablearraynsarray

JSON Parsing in iOS 7


I am creating an app for as existing website. They currently has the JSON in the following format :

[

   {
       "id": "value",
       "array": "[{\"id\" : \"value\"} , {\"id\" : \"value\"}]"
   },
   {
       "id": "value",
       "array": "[{\"id\" : \"value\"},{\"id\" : \"value\"}]"
   } 
]

which they parse after escaping the \ character using Javascript.

My problem is when i parse it in iOS using the following command :

NSArray *result = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&localError];

and do this :

NSArray *Array = [result valueForKey:@"array"];

Instead of an Array I got NSMutableString object.

  • The website is already in production so I just cant ask them to change their existing structure to return a proper JSON object. It would be a lot of work for them.

  • So, until they change the underlying stucture, is there any way i can make it work in iOS like they do with javascript on their website?

Any help/suggestion would be very helpful to me.


Solution

  • The correct JSON should presumably look something like:

    [
        {
            "id": "value",
            "array": [{"id": "value"},{"id": "value"}]
        },
        {
            "id": "value",
            "array": [{"id": "value"},{"id": "value"}]
        }
    ]
    

    But, if you're stuck this the format provided in your question, you need to make the dictionary mutable with NSJSONReadingMutableContainers and then call NSJSONSerialization again for each of those array entries:

    NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
    if (error)
        NSLog(@"JSONObjectWithData error: %@", error);
    
    for (NSMutableDictionary *dictionary in array)
    {
        NSString *arrayString = dictionary[@"array"];
        if (arrayString)
        {
            NSData *data = [arrayString dataUsingEncoding:NSUTF8StringEncoding];
            NSError *error = nil;
            dictionary[@"array"] = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
            if (error)
                NSLog(@"JSONObjectWithData for array error: %@", error);
        }
    }