PHP展平JSON对象数组?

Posted

技术标签:

【中文标题】PHP展平JSON对象数组?【英文标题】:PHP flattening JSON array of objects? 【发布时间】: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 是你的朋友 - 你应该把结果放在你的问题中 【参考方案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
                    )

            )



       )

)

【讨论】:

以上是关于PHP展平JSON对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

将带有数组的 json 结构展平为多个没有数组的平面对象

将嵌套的 JSON 对象展平并排序到 javascript 中的数组中

展平 Powershell 对象中的子数组,包括父对象属性

使用 jq 保留键名展平 JSON

展平/取消展平嵌套 JSON 对象的最快方法