【问题标题】:How to combine two arrays with different types of entities into one json object?如何将两个不同类型实体的数组组合成一个json对象?
【发布时间】:2015-12-26 06:52:33
【问题描述】:

我在objective C中有两个数组,它们的数据结构如下:

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

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

我的任务是将这两个数组放入一个 json NSData 对象中。同时,在 json 数据中,我应该将名称“People”分配给第一种类型的数组实体,将“Car”分配给第二种类型的数组实体,所以稍后在 php 方面,我应该能够分辨出哪个是哪个并将它们分别放入不同的表中。您能帮我找到生成所需 json 对象的正确方法吗?

【问题讨论】:

  • 请分享您的代码。请在 key 中取出带有提到的关键字的字典,并将这些数组放在相应的键中。
  • 显示你想要的最终数组结果。

标签: php objective-c arrays json


【解决方案1】:

您可以获取两个数组,然后使用两个键 peoplecars 构建一个新字典,使用您的两个数组作为与这两个键关联的值。例如:

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

生成的 JSON(格式化以便您更容易阅读)如下所示:

{
  "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"
    }
  ]
}

要发送该请求,您可以执行以下操作:

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

在 PHP 中,要解析此响应,您可以执行以下操作:

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

?>

【讨论】:

    【解决方案2】:

    在 PHP 中,您可以像下面这样组合 2 个 jsons

    $j1 = '[{"index":"1","lastName":"Brown","firstName":"Kathy","company":"ABC inc."},
        {"index":"2","lastName":"Smith","firstName":"Mike","company":"XYZ inc."}]';
    
    $j2 = '[{"index":"1","make":"Toyota","model":"RAV4","year":"2009"},
        {"index":"2","make":"Honda","model":"Pilot","year":"2012"}]';
    
    $combined_array = array("People"=>json_decode($j1, true)) + array("Cars"=>json_decode($j2, true));
    $combined_json = json_encode($combined_array);
    
    print_r($combined_array);
    print_r($combined_json);
    

    输出:

    Array
    (
        [Peolpe] => Array
            (
                [0] => Array
                    (
                        [index] => 1
                        [lastName] => Brown
                        [firstName] => Kathy
                        [company] => ABC inc.
                    )
    
                [1] => Array
                    (
                        [index] => 2
                        [lastName] => Smith
                        [firstName] => Mike
                        [company] => XYZ inc.
                    )
    
            )
    
        [Cars] => Array
            (
                [0] => Array
                    (
                        [index] => 1
                        [make] => Toyota
                        [model] => RAV4
                        [year] => 2009
                    )
    
                [1] => Array
                    (
                        [index] => 2
                        [make] => Honda
                        [model] => Pilot
                        [year] => 2012
                    )
    
            )
    
    )
    {"Peolpe":[{"index":"1","lastName":"Brown","firstName":"Kathy","company":"ABC inc."},
        {"index":"2","lastName":"Smith","firstName":"Mike","company":"XYZ inc."}],
    "Cars":[{"index":"1","make":"Toyota","model":"RAV4","year":"2009"},
        {"index":"2","make":"Honda","model":"Pilot","year":"2012"}]}
    

    如果要打印 json 字符串的输出,可以使用 JSON_PRETTY_PRINT 选项作为 json_encode

    $combined_json = json_encode($combined_array, JSON_PRETTY_PRINT);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2016-07-20
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多