Проблема:
Я конвертирую некоторые таблицы 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"}
]
Редактировать: я не хочу этого: (потому что ноль будет рассматриваться как строка)
[
{"firstname":"John", "middlename":"Timothy", "lastname":"Doe"} ,
{"firstname":"Mary", "middlename":"null", "lastname":"Jane"}
]
Что я пробовал:
Я попытался отредактировать мой запрос для SELECT имя, отчество, фамилия ОТ от имени ГДЕ (nametable — >> ‘middlename’) — ноль, но он глючит и не запускается.
Я также пробовал SELECT имя, отчество, фамилия 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);
Еще раз спасибо, ребята!
Преобразуйте пустое поле в строку, если хотите, чтобы 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"]. '"}';
}
Поскольку наличие нулевого значения в базе данных вызывает проблему, почему бы не хранить вместо него «нулевую» строку, а при создании формата JSON используйте условный оператор для выбора действительного нулевого значения. Это пример того, как ваш код выглядит следующим образом:
$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 .="]";
Вот пример с некоторыми фиктивными данными
$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.']';