将SQL转换为JSON并保持空值?

时间:2017-02-20 20:12:25

标签: php mysql sql json

问题:

我正在将一些SQL表转换为JSON格式,并且我有一些空值,这些值没有以我想要的格式显示。当我的表中有一个空值时,它在转换为JSON时会变成“”,但我希望它只是说空而不是双引号。

代码:

$conn = new mysqli($servername, $username, $password, $dbname);
$result = $conn->query("SELECT firstname, middlename, lastname FROM nametable");

$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    if ($outp != "[") {$outp .= ",";}
    $outp .= '{"firstname":"'  . $rs["firstname"] . '",';
    $outp .= '"middlename":"'   . $rs["middlename"]        . '",';
    $outp .= '"lastname":"'   . $rs["lastname"]        . '"}';
}
$outp .="]";
$conn->close();
echo($outp);

我得到的JSON格式:

[
   {"firstname":"John", "middlename": "Timothy", "lastname":"Doe"} ,
   {"firstname":"Mary", "middlename":"", "lastname":"Jane"}
]

我想要的JSON格式:(中间名后的不同部分为空)

[
   {"firstname":"John", "middlename":"Timothy", "lastname":"Doe"} ,
   {"firstname":"Mary", "middlename": null, "lastname":"Jane"}
]

编辑:我不想要这个:(因为null会被视为字符串)

[
   {"firstname":"John", "middlename":"Timothy", "lastname":"Doe"} ,
   {"firstname":"Mary", "middlename":"null", "lastname":"Jane"}
]

我尝试了什么:

  • 我尝试将我的查询编辑为SELECT firstname,middlename,lastname FROM nametable WHERE(nametable->>'middlename')为null但它会出错并且不会运行。

  • 我也尝试过SELECT firstname,middlename,lastname FROM nametable FOR JSON AUTO,INCLUDE_NULL_VALUES但它也不会运行。

感谢您提出任何建议!

最终编辑:我讨论了每个人的建议,我在中间使用了if / else语句:

$conn = new mysqli($servername, $username, $password, $dbname);
$result = $conn->query("SELECT firstname, middlename, lastname FROM nametable");

$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    if ($outp != "[") {$outp .= ",";}
    $outp .= '{"firstname":"'  . $rs["firstname"] . '",';
    if (is_null($rs['middlename']) == true)
       $outp .= '"middlename":null,';
    else
       $outp .= '"middlename":"'   . $rs["middlename"]        . '",';     
    $outp .= '"lastname":"'   . $rs["lastname"]        . '"}';
}
$outp .="]";
$conn->close();
echo($outp);

再次感谢你们!

3 个答案:

答案 0 :(得分:0)

如果您希望JSON打印NULL而不是空白

,请将空字段转换为字符串
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
    if ($outp != "[") {$outp .= ",";}
    $outp .= '{"firstname":"'. $rs["firstname"] == null ?"null":$rs["firstname"]. '",';
    $outp .= '"middlename":"'. $rs["middlename"] == null ?"null":$rs["middlename"]. '",';
    $outp .= '"lastname":"'. $rs["lastname"] == null ?"null":$rs["lastname"]. '"}';
}

答案 1 :(得分:0)

由于数据库中的null会导致问题,为什么不存储“null”字符串,并且在创建JSON格式时,使用条件运算符来选择真正的null。这是一个示例,代码假设如下: / p>

$outp = "[";
while($rs = $result->fetch_array(MYSQLI_ASSOC)) {
if ($outp != "[") {$outp .= ",";}
  $outp .= '{"firstname":"'  . $rs["firstname"] == "null" ? null : $rs["firstname"].'",';
  $outp .= '"middlename":"'   . $rs["middlename"]  == "null" ? null :  $rs["middlename"].'",';
  $outp .= '"lastname":"'   . $rs["lastname"] == "null" ? null : $rs["lastname"].'"}';
}
$outp .="]";

答案 2 :(得分:0)

以下是一些虚拟数据的示例

$db_results = array(
    array('fname'=>'john', 'lname'=>'doe', 'property'=>''),
    array('fname'=>'john', 'lname'=>'doe', 'property'=>''),
    array('fname'=>'john', 'lname'=>'doe', 'property'=>NULL)
);

$output='';
$rowStr = '';
foreach($db_results as $i=>$row) {
    $rowStr="{";
    $rowStr.= '"fname":'.((is_null($row['fname']) || empty($row['fname'])) ? 'null' : '"'.$row['fname'].'"');
    $rowStr.= ',"lname":'.((is_null($row['lname']) || empty($row['lname'])) ? 'null' : '"'.$row['lname'].'"');
    $rowStr.= ',"property":'.((is_null($row['property']) || empty($row['property'])) ? 'null' : '"'.$row['property'].'"');
    $rowStr.='}'; //add a comma here when a condition is met
    $output.= $rowStr;
}

echo '['.$output.']';