有条件地格式化JSON

时间:2017-04-28 15:13:53

标签: 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 = "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组合,但我似乎无法完全按照我想要的方式获得它。有人可以帮忙吗?

3 个答案:

答案 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)

Try this code snippet here

"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

是什么
  • 如果你有一个关联数组,它就变成了一个json_object
  • 如果你有一个索引数组,它就变成了json_array
  • 如果你有一个对象,它就变成了一个json_object
  • 如果你有混合的assoc / index数组,你就会像你的例子一样破坏json。属性名称0! (防止!)

祝你有愉快的一天......