【问题标题】:Correctly format JSON file正确格式化 JSON 文件
【发布时间】:2019-12-12 00:34:40
【问题描述】:

我正在尝试创建一个包含对象和数组的 JSON 文件。然而我错过了[ ]-brackets。我真的不知道这些 JSON 部分的确切术语,这使得使用 Google 找到解决方案非常困难。我也是一个相当新的 PHP 编码器,所以我还在学习。非常感谢任何帮助或提示!

创建 JSON 文件的代码:

$db_export = [
    'account' => [
          'username' => $username,
          'email' => $email
    ]
];


file_put_contents("output.json", json_encode($db_export, JSON_PRETTY_PRINT));

输出为:

{
  "account": {
     "username": "test",
     "email": "test@domain.com"
  }
}

它应该是什么:

{
  "account": [
    {
      "username": "test",
      "email": "test@domain.com"
    }
  ]
}

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

    添加[] 字符会有所帮助。这会在数组内部创建一个数组。

    $db_export = [
        'account' => [[ // <--- Added
          'username' => $username,
          'email' => $email
        ]] // <--- Added
    ];
    
    
    file_put_contents("output.json", json_encode($db_export, JSON_PRETTY_PRINT));
    

    这就是你得到你想要的结果的方式。

    输出:

    { "account": [ { "username": null, "email": null } ] }
    

    我想这有点简单:)

    【讨论】:

    • 您应该在回答中提供解释。
    • 无论您认为什么会帮助提问者理解您的答案,以及为什么它会解决他们的问题。请记住,将来人们可能会找到您的答案。
    【解决方案2】:

    我添加这个是为了解释原始答案的情况。您可以在示例部分的json_encode php manual page 中找到相同的信息。

    对于任何简单的 PHP 数组,json_encode 都会将 PHP 数组转换为 JSON 数组:

    $simple = array('apple', 'banana', 'coconut');
    echo json_encode($simple);
    

    返回:

    ["苹果","香蕉","椰子"]

    任何关联数组都会变成一个 json 对象{},每个关联键都会变成一个属性名。

    $associative = array('breakfast' => 'apple', 'lunch' => 'banana', 'dinner' => 'coconut');
    echo json_encode($associative);
    

    返回:

    {"早餐":"苹果","午餐":"香蕉","晚餐":"椰子"}

    在您的示例中,您有一个带有关联键“帐户”的数组,其中包含一个包含 2 个子元素的数组,每个子元素都有一个关联键。 这就是 json_encode() 将您的结构转换为 json 对象的原因。

    在@Smokie 的回答中,添加了一个“简单”的额外父数组,即。未键入名称,导致 json_encode(遵循其简单的转换规则)创建一个 javascript 数组,然后将 javascript 对象粘贴到该数组中。

    $username = 'test user';
    $email = 'foo@bar.com';
    
    
    $db_export = [
        'account' => [[ // <--- Added
          'username' => $username,
          'email' => $email
        ]] // <--- Added
    ];
    var_dump($db_export);
    

    返回:

    array(1) {
      ["account"]=>
      array(1) {
        [0]=>
        array(2) {
          ["username"]=>
          string(9) "test user"
          ["email"]=>
          string(11) "foo@bar.com"
        }
      }
    }
    

    这里我使用 var_dump 作为快速调试工具来显示 PHP 数组的样子。需要注意的重要一点是,“帐户”现在是一个数组 (1),其中一个元素(第 0 个元素)包含您的原始子数组。

    您可能需要这个,因为假设一个帐户可能有多个帐户名/电子邮件地址对。如果不是这种情况,我会质疑您为什么需要强制使用无用的数组。我个人不明白一个“帐户”如何有多个与之关联的用户名/电子邮件对。

    话虽如此,这段代码应该进一步说明这一切是如何工作的,以及为什么:

    $username = 'test user';
    $email = 'foo@bar.com';
    
    $db_export = [
        'account' => [[ // <--- Added
          'username' => $username,
          'email' => $email
        ]] // <--- Added
    ];
    
    //Add another username/email pair to account
    $db_export['account'][] = ['username' => 'test2 user', 'email' => 'test2@bar.com'];
    
    echo json_encode($db_export, JSON_PRETTY_PRINT);
    

    返回:

    {
        "account": [
            {
                "username": "test user",
                "email": "foo@bar.com"
            },
            {
                "username": "test2 user",
                "email": "test2@bar.com"
            }
        ]
    }
    

    【讨论】:

    • 不用担心,恭喜您接受了答案和点赞;)
    • 完美!这对我来说很清楚。我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 2021-11-16
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多