Php 有条件地格式化JSON

Php 有条件地格式化JSON,php,arrays,json,Php,Arrays,Json,我正在尝试学习PHP,并且正在尝试生成一些JSON 这是我想要的格式 { "Data": "Message was sent on 12-31-1999 12:00:00 am", "Sandbox": { "Sandboxed": true }, "Errors": [{ "Code": 5, "Message": "Message bounced back" }] } 我可以这样做: $message

我正在尝试学习PHP,并且正在尝试生成一些JSON

这是我想要的格式

{
    "Data": "Message was sent on 12-31-1999 12:00:00 am",
    "Sandbox": {
        "Sandboxed": true
    },
    "Errors": [{
        "Code": 5,
        "Message": "Message bounced back"
    }]
}
我可以这样做:

$message = "Message was sent on 12-31-1999 12:00:00 am";
$errorMsg = "Message bounced back";

$sandboxkey = array( "Sandboxed" => true );

$error = array( "Code" => 5, "Message" => $errorMsg );

$package = array(
    "Data" => $message,
    "Sandbox" => $sandboxkey,
    "Errors" => $error
);

return json_encode($package, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
但是如果设置了布尔值,我只想添加“Sandbox”键/值

$isSandbox = true;
$message = "Message was sent on 12-31-1999 12:00:00 am";
$errorMsg = "Message bounced back";
$error = array( "Code" => 5, "Message" => $errorMsg );
$package = array(
    "Data" => $message,
    "Errors" => $error
);
if ($isSandbox) {
    $sandboxkey = array( "Sandboxed" => true );
    array_push($package, $sandboxkey);
}
$error = array( "Code" => 5, "Message" => $errorMsg );
return json_encode($package, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
但这会添加一个“0”,然后添加KVP

{
    "Data": "Message was sent on 12-31-1999 12:00:00 am",
    "Errors": {
        "Code": 5,
        "Message": "Message bounced back"
    },
    "0": {
        "Sandboxed": true
    }
}
此外,我希望将错误列在如下数组中:

"Errors": [{
        "Code": 5,
        "Message": "Message bounced back"
    },
            {
        "Code": 4,
        "Message": "Message is old"
    }  ]
{
    "Data": "Message was sent on 12-31-1999 12:00:00 am",
    "Errors": [
        {
            "Code": 5,
            "Message": "Message bounced back"
        }
    ],
    "Sandboxed": true
}
我尝试了数组推送和JSON_FORCE_对象的多种组合,但我似乎无法完全按照我的意愿获得它。有人能帮忙吗?

但这会添加一个“0”,然后添加KVP

{
    "Data": "Message was sent on 12-31-1999 12:00:00 am",
    "Errors": {
        "Code": 5,
        "Message": "Message bounced back"
    },
    "0": {
        "Sandboxed": true
    }
}
如果数组是数字数组(即键是整数-例如
0=>'cat',1=>'dog'
),则可以使用。但在这种情况下,数组是关联数组。设置所需键沙盒的一种方法是通过在括号符号中指定来设置数组键:

if ($isSandbox) {
    $sandboxkey = array( "Sandboxed" => true );
    $package['Sandbox'] = $sandboxkey;
}
这是必需的,因为数组的其他键不是

请参见中的演示

否则可以使用:

if ($isSandbox) {
    $sandboxArray = array(
    'Sandbox' => array( "Sandboxed" => true )
    );
    $package = array_merge($package, $sandboxArray);
}
看到一个演示

有关数字数组与关联数组的更多信息,请参阅。令人惊讶的是,在列表中没有明确说明这一差异

此外,我希望在数组中列出错误

为此,在另一个数组中嵌套
$error
(关联数组,将转换为JSON对象)

$package = array(
    "Data" => $message,
    "Sandbox" => $sandboxkey,
    "Errors" => array($error)
);
但这会添加一个“0”,然后添加KVP

{
    "Data": "Message was sent on 12-31-1999 12:00:00 am",
    "Errors": {
        "Code": 5,
        "Message": "Message bounced back"
    },
    "0": {
        "Sandboxed": true
    }
}
如果数组是数字数组(即键是整数-例如
0=>'cat',1=>'dog'
),则可以使用。但在这种情况下,数组是关联数组。设置所需键沙盒的一种方法是通过在括号符号中指定来设置数组键:

if ($isSandbox) {
    $sandboxkey = array( "Sandboxed" => true );
    $package['Sandbox'] = $sandboxkey;
}
这是必需的,因为数组的其他键不是

请参见中的演示

否则可以使用:

if ($isSandbox) {
    $sandboxArray = array(
    'Sandbox' => array( "Sandboxed" => true )
    );
    $package = array_merge($package, $sandboxArray);
}
看到一个演示

有关数字数组与关联数组的更多信息,请参阅。令人惊讶的是,在列表中没有明确说明这一差异

此外,我希望在数组中列出错误

为此,在另一个数组中嵌套
$error
(关联数组,将转换为JSON对象)

$package = array(
    "Data" => $message,
    "Sandbox" => $sandboxkey,
    "Errors" => array($error)
);

您必须在代码中做一些更改,这将帮助您实现预期的输出

1.使用
array\u merge
而不是
array\u push

2.设置
Errors
如下键
“Errors”=>数组($error)
而不是
“Errors”=>$error


您必须在代码中做一些更改,这将帮助您实现预期的输出

1.使用
array\u merge
而不是
array\u push

2.设置
Errors
如下键
“Errors”=>数组($error)
而不是
“Errors”=>$error

如何处理json:

  • []
    是json格式的数组
  • {}
    是json中的对象
所以要创建类似于
{'data':[{'depperdata':2}]}
do

 $a = new stdClass();
 $a->data = array();
 $b = new stdClass();
 $b->deeperdata=2;
 $a->data[0]=$b;
 print_r(json_encode($a,JSON_PRETTY_PRINT));

json\u解码什么

  • 如果您有一个assoc数组,它将成为一个json_对象
  • 如果您有一个索引数组,它将成为一个json_数组
  • 如果您有一个对象,它将成为一个json_对象
  • 如果您使用的是混合的assoc/索引数组,则会像您的示例一样出现断开的json。属性名
    0
    !(防止这种情况!)
祝你今天愉快…

如何处理json:

  • []
    是json格式的数组
  • {}
    是json中的对象
所以要创建类似于
{'data':[{'depperdata':2}]}
do

 $a = new stdClass();
 $a->data = array();
 $b = new stdClass();
 $b->deeperdata=2;
 $a->data[0]=$b;
 print_r(json_encode($a,JSON_PRETTY_PRINT));

json\u解码什么

  • 如果您有一个assoc数组,它将成为一个json_对象
  • 如果您有一个索引数组,它将成为一个json_数组
  • 如果您有一个对象,它将成为一个json_对象
  • 如果您使用的是混合的assoc/索引数组,则会像您的示例一样出现断开的json。属性名
    0
    !(防止这种情况!)

祝你有愉快的一天…

JSON\u FORCE\u OBJECT
从数组生成一个对象。index
0
成为JSON对象的属性。不要使用它。
JSON\u FORCE\u OBJECT
从数组生成一个对象。index
0
成为JSON对象的属性。不要使用它。
{}
是JS中的对象,因为这是php中的调用,它也是一个关联数组是JS中的对象,因为在php中它也是一个关联数组。感谢您花时间!这非常有效。那么,接下来,为什么要
array\u merge
而不是
array\u push
?@user-44651
array\u merge
合并指定数组中的
值对这里as
array\u push
在某个索引处推送一个
array
或一个变量。感谢您花时间!这非常有效。那么,接下来,为什么
array\u merge
而不是
array\u push
?@user-44651
array\u merge
值对合并到指定的数组中,其中as
array_push
在某个索引处推送一个
数组
或一个变量。太棒了!感谢您花时间解释
数组_push()
是的NP-我更新了解释,提到了数组_merge()-也许它会很有帮助太棒了!感谢您花时间解释
数组_push())
Yeah NP-我更新了解释,提到了array\u merge()-也许会有帮助