Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to combine two arrays with different types of entities into one json object?

I have two arrays in objective C. Their data structures are as follows:

{"index":"1","lastName":"Brown","firstName":"Kathy","company":"ABC inc."},
{"index":"2","lastName":"Smith","firstName":"Mike","company":"XYZ inc."}

and

{"index":"1","make":"Toyota","model":"RAV4","year":"2009"},
{"index":"2","make":"Honda","model":"Pilot","year":"2012"}

My task is putting these two arrays into one json NSData object. Meanwhile, in the json data, I should assign the name "People" to the first type of array entities, and "Car" to the second type of array entities, so later on on the php side, I should be able to tell which is which and put them into different tables respectively. Could you help me find the right way to generate the desired json object?

like image 495
PaulLian Avatar asked Oct 18 '22 19:10

PaulLian


1 Answers

You can take your two arrays and then build a new dictionary with two keys, people and cars, using your two arrays as the values associated with those two keys. For example:

NSArray *people = @[@{@"index":@"1",@"lastName":@"Brown",@"firstName":@"Kathy",@"company":@"ABC inc."},
                    @{@"index":@"2",@"lastName":@"Smith",@"firstName":@"Mike",@"company":@"XYZ inc."}];

NSArray *cars = @[@{@"index":@"1",@"make":@"Toyota",@"model":@"RAV4",@"year":@"2009"},
                  @{@"index":@"2",@"make":@"Honda",@"model":@"Pilot",@"year":@"2012"}];

NSDictionary *fullDictionary = @{@"people": people, @"cars": cars};

NSError *error;
NSData *data = [NSJSONSerialization dataWithJSONObject:fullDictionary options:0 error:&error];

The resulting JSON (formatted so you can read it more easily) would look like:

{
  "cars" : [
    {
      "model" : "RAV4",
      "year" : "2009",
      "make" : "Toyota",
      "index" : "1"
    },
    {
      "model" : "Pilot",
      "year" : "2012",
      "make" : "Honda",
      "index" : "2"
    }
  ],
  "people" : [
    {
      "lastName" : "Brown",
      "firstName" : "Kathy",
      "company" : "ABC inc.",
      "index" : "1"
    },
    {
      "lastName" : "Smith",
      "firstName" : "Mike",
      "company" : "XYZ inc.",
      "index" : "2"
    }
  ]
}

To send that request, you could do something like the following:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
request.HTTPBody = data;
request.HTTPMethod = @"POST";

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // check for fundamental networking error (e.g. not connected to Internet)

    if (error) {
        NSLog(@"error = %@", error);
        return;
    }

    // also check to see if the server reported some HTTP error

    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        if (statusCode != 200) {
            NSLog(@"statusCode = %ld", (long)statusCode);
            return;
        }
    }

    // OK, if we've gotten here, let's parse the response; I'm assuming you'll send JSON response; so parse it

    NSError *parseError;
    NSDictionary *responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
    if (parseError) {
        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"responseString = %@", responseString);
    } else {
        NSLog(@"responseObject = %@", responseObject);
    }
}];
[task resume];

And in PHP, to parse this response you can do something like:

<?php

header("Content-Type: application/json");

$handle = fopen("php://input", "rb");
$raw_post_data = '';
while (!feof($handle)) {
    $raw_post_data .= fread($handle, 8192);
}
fclose($handle);

$json_data = json_decode($raw_post_data, true);

$people = $json_data["people"];
$cars = $json_data["cars"];

foreach ($people as $person) {
    $index      = $person["index"];
    $last_name  = $person["lastName"];
    $first_name = $person["firstName"];
    $company    = $person["company"];

    // use these four variables to insert row of data here; note, make sure you either use 
    // `mysqli::real_escape_string` or that you manually bind these values to `?` placeholders
}

foreach ($cars as $car) {
    $index = $car["index"];
    $make  = $car["make"];
    $model = $car["model"];
    $year  = $car["year"];

    // again, use these four variables to insert row of data here; note, make sure you either use 
    // `mysqli::real_escape_string` or that you manually bind these values to `?` placeholders
}

// obviously, if we had errors above, we'd send something like Array("success" => false, ...) with error messages and error codes
$response = Array("success" => true);
echo json_encode($response);

?>
like image 169
Rob Avatar answered Nov 01 '22 07:11

Rob