【问题标题】:PHP flattening JSON array of objects?PHP展平JSON对象数组?
【发布时间】:2014-08-18 10:05:42
【问题描述】:

我正在使用 AFNetworking 从 iOS 应用发布一些 JSON。这似乎工作正常,我发送的 JSON 格式如下:

{
    "user":{
        "firstName":"Joe",
        "lastName":"Blogs",
        "contact":{
            "email":"joe@blogs.com",
            "phone":"0800900800"
        },
        "list":[
            {
                "name":"Item1",
                "code":"ITM1",
                "category":0
            },
            {
                "name":"Item2",
                "code":"ITM2",
                "category":3
            },
            {
                "name":"Item3",
                "code":"ITM3",
                "category":2
            }
        ]
    }
}

然后我将这个 JSON 的内容解析到一个 MySQL 表中。我可以按照您对 PHP 中 JSON 的期望读取所有信息(名字、姓氏、联系人等):

<?php
    $json = $_POST["user"];

    $fname = $json["firstName"];
    $lname = $json["lastName"];

    $contact = $json["contact"];
    $email = $contact["email"];
    .
    .
    .
?>

但是,当我遍历“列表”数组时,该数组似乎被展平了。如果我进行计数:

$list = $json["list"];
$listCount = count($list);

$listCount 将等于 9(即数组中的 3 个对象 x 每个对象的 3 个属性,就好像数组已被展平一样),而不是我期望的 3。

我是否误解了 JSON 数组在 PHP 中是如何解析的,或者 AFNetworking 是否会在发布之前以某种方式处理 JSON?

更新:

var_dumped JSON 的“list”数组部分,我得到了这个:

["list"]=>
array(9) {
[0]=>
array(1) {
  ["name"]=>
  string(5) "Item1"
}
[1]=>
array(1) {
  ["code"]=>
  string(4) "ITM1"
}
[2]=>
array(1) {
  ["category"]=>
  string(1) "0"
}
[3]=>
array(1) {
  ["name"]=>
  string(5) "Item2"
}
[4]=>
array(1) {
  ["code"]=>
  string(4) "ITM2"
}
[5]=>
array(1) {
  ["category"]=>
  string(1) "3"
}
[6]=>
array(1) {
  ["name"]=>
  string(5) "Item3"
}
[7]=>
array(1) {
  ["code"]=>
  string(4) "ITM3"
}
[8]=>
array(1) {
  ["category"]=>
  string(1) "2"
}
}

所以看起来好像原始数组中的每个对象都被分割成它自己在这个数组中的对象。

作为参考,这是我在 iOS 应用中使用 AFNetworking 的请求:

User *user = [users objectAtIndex:0];
NSDictionary *userDictionary = [user serialiseUser];
NSLog(@"User\n%@", userDictionary);

NSURL *url = [NSURL URLWithString:baseURL];
AFHTTPRequestOperationManager *operationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];

if (operationManager) {
    [operationManager POST:path
                parameters:userDictionary
                   success:^(AFHTTPRequestOperation *operation, id responseObject) {
                       NSLog(@"Success: %@", responseObject);
                   }
                   failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                       NSLog(@"Failed: %@", error);
                       NSLog(@"%@", operation.responseString);
                   }];

serialiseUser 生成上面的原始 JSON/Dictionary 对象。

提前感谢您的任何见解。

【问题讨论】:

  • 为了在服务器端解码json,你应该使用json_decode,但是你在哪里使用的呢?
  • var_dump 和 print_r 是你的朋友 - 你应该把结果放在你的问题中

标签: php objective-c arrays json afnetworking


【解决方案1】:

尝试像下面这样解码 json

<?php
 $json = json_decode($_POST["user"]);
 print_r($json);
?>

stdClass Object
(
    [user] => stdClass Object
        (
            [firstName] => Joe
            [lastName] => Blogs
            [contact] => stdClass Object
                (
                    [email] => joe@blogs.com
                    [phone] => 0800900800
                )

        [list] => Array
            (
                [0] => stdClass Object
                    (
                        [name] => Item1
                        [code] => ITM1
                        [category] => 0
                    )

                [1] => stdClass Object
                    (
                        [name] => Item2
                        [code] => ITM2
                        [category] => 3
                    )

                [2] => stdClass Object
                    (
                        [name] => Item3
                        [code] => ITM3
                        [category] => 2
                    )

            )



       )

)

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 2021-12-25
    • 2018-02-24
    • 2015-05-23
    • 2023-01-11
    • 2021-12-29
    • 2020-07-04
    • 2017-04-06
    • 2017-05-13
    相关资源
    最近更新 更多