我正在尝试学习 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"
} ]
我尝试了多种数组推送和JSON_FORCE_OBJECT组合,但我似乎无法完全按照我想要的方式获得它。有人可以帮忙吗?
答案 0 :(得分:2)
如果数组是数字数组,则可以使用但是这会增加一个“0”然后是KVP。
array_push()
(即键是整数 - 例如0 => 'cat', 1 => 'dog'
。但在这种情况下,数组是关联数组。设置所需键 Sandbox 的一种方法是通过用括号表示法来设置数组键:
if ($isSandbox) {
$sandboxkey = array( "Sandboxed" => true );
$package['Sandbox'] = $sandboxkey;
}
这是必要的,因为数组的其他键不是
在this playground example中看到它。
否则可以使用array_merge():
if ($isSandbox) {
$sandboxArray = array(
'Sandbox' => array( "Sandboxed" => true )
);
$package = array_merge($package, $sandboxArray);
}
参见this playground example中的演示。
有关数字与关联数组的更多信息,请参阅this answer。有点令人惊讶的是,PHP Array data type page没有明确说明差异。
此外,我希望错误列在数组中......
为此,在另一个数组中嵌套$error
(一个关联数组,将转换为JSON对象)。
$package = array(
"Data" => $message,
"Sandbox" => $sandboxkey,
"Errors" => array($error)
);
答案 1 :(得分:2)
您必须对代码进行一些更改,这将有助于您实现预期的输出。
1。使用
array_merge
代替array_push
2。设置
Errors
密钥,而不是"Errors" => array($error)
"Errors" => $error
<强>输出:强>
<?php
ini_set('display_errors', 1);
$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" => array($error)
);
if ($isSandbox)
{
$sandboxkey = array("Sandboxed" => true);
$package=array_merge($package, $sandboxkey);
}
echo json_encode($package,JSON_PRETTY_PRINT);
答案 2 :(得分:1)
如何处理json:
[]
是json {}
是json中的对象所以创建像{'data':[{'depperdata':2}]}
做
$a = new stdClass();
$a->data = array();
$b = new stdClass();
$b->deeperdata=2;
$a->data[0]=$b;
print_r(json_encode($a,JSON_PRETTY_PRINT));
或
$a = array('data'=>array(array('depperdata'=>2)));
print_r(json_encode($a,JSON_PRETTY_PRINT));
json_decode
0
! (防止!)祝你有愉快的一天......